variable - datetime class c#




Ricevi le date del primo e dell'ultimo giorno del mese precedente in C# (8)

Il caso d'uso canonico nell'e-commerce è la data di scadenza della carta di credito, MM / aa. Sottrarre un secondo invece di un giorno. Altrimenti la carta apparirà scaduta per l'intero ultimo giorno del mese di scadenza.

DateTime expiration = DateTime.Parse("07/2013");
DateTime endOfTheMonthExpiration = new DateTime(
  expiration.Year, expiration.Month, 1).AddMonths(1).AddSeconds(-1);

Non riesco a pensare a una facile o due fodera che otterrebbe i mesi precedenti, il primo giorno e l'ultimo giorno.

Sono LINQ, che supporta un'applicazione web di sondaggi e hanno spremuto un nuovo requisito in.

Il sondaggio deve includere tutte le richieste di servizio per il mese precedente. Quindi, se è il 15 aprile, ho bisogno di tutti gli ID di richiesta delle Marche.

var RequestIds = (from r in rdc.request 
                  where r.dteCreated >= LastMonthsFirstDate && 
                  r.dteCreated <= LastMonthsLastDate 
                  select r.intRequestId);

Non riesco a pensare alle date facilmente senza un interruttore. A meno che non sia cieco e trascuri un metodo interno per farlo.


Il modo in cui l'ho fatto in passato è il primo giorno di questo mese

dFirstDayOfThisMonth = DateTime.Today.AddDays( - ( DateTime.Today.Day - 1 ) );

Quindi sottrarre un giorno per arrivare alla fine del mese scorso

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

Quindi sottrarre un mese per ottenere il primo giorno del mese precedente

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);

Questa è una risposta alla risposta di Mike W:

internal static DateTime GetPreviousMonth(bool returnLastDayOfMonth)
{
    DateTime firstDayOfThisMonth = DateTime.Today.AddDays( - ( DateTime.Today.Day - 1 ) );
    DateTime lastDayOfLastMonth = firstDayOfThisMonth.AddDays (-1);
    if (returnLastDayOfMonth) return lastDayOfLastMonth;
    return firstDayOfThisMonth.AddMonths(-1);
}

Puoi chiamarlo così:

dateTimePickerFrom.Value = GetPreviousMonth(false);
dateTimePickerTo.Value = GetPreviousMonth(true);

Se esiste la possibilità che i tuoi dati non siano date di calendario rigide, dovresti considerare l'utilizzo di confronti di esclusione di fine data ... Questo ti impedirà di perdere qualsiasi richiesta creata durante la data del 31 gennaio.

DateTime now = DateTime.Now;
DateTime thisMonth = new DateTime(now.Year, now.Month, 1);
DateTime lastMonth = thisMonth.AddMonths(-1);

var RequestIds = rdc.request
  .Where(r => lastMonth <= r.dteCreated)
  .Where(r => r.dteCreated < thisMonth)
  .Select(r => r.intRequestId);

utilizzando Fluent DateTime github.com/FluentDateTime/FluentDateTime

        var lastMonth = 1.Months().Ago().Date;
        var firstDayOfMonth = lastMonth.FirstDayOfMonth();
        var lastDayOfMonth = lastMonth.LastDayOfMonth();

EDIT: Questo non è il modo di farlo!
Se today.Month - 1 = 0, come in Jan, questo genererà un'eccezione. Questo è chiaramente il caso in cui essere furbi ti mette nei guai!

Un po 'più semplice della risposta accettata :

var today = DateTime.Today
var first = new DateTime(today.Year, today.Month - 1, 1);
var last  = new DateTime(today.Year, today.Month, 1).AddDays(-1);

Salva una creazione di DateTime in più.


DateTime now = DateTime.Now;
int prevMonth = now.AddMonths(-1).Month;
int year = now.AddMonths(-1).Year;
int daysInPrevMonth = DateTime.DaysInMonth(year, prevMonth);
DateTime firstDayPrevMonth = new DateTime(year, prevMonth, 1);
DateTime lastDayPrevMonth = new DateTime(year, prevMonth, daysInPrevMonth);
Console.WriteLine("{0} {1}", firstDayPrevMonth.ToShortDateString(),
  lastDayPrevMonth.ToShortDateString());

var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);       
var first = month.AddMonths(-1);
var last = month.AddDays(-1);

In linea se hai davvero bisogno di una o due linee.





date