Je ne peux pas penser à un ou deux paquebots faciles qui obtiendraient le premier et le dernier jour des mois précédents.
Je suis LINQ-ifying une application web de sondage, et ils ont pressé une nouvelle exigence dans.
L'enquête doit inclure toutes les demandes de service pour le mois précédent. Donc, si c'est le 15 avril, j'ai besoin de tous les identifiants de demande de Marches.
var RequestIds = (from r in rdc.request
where r.dteCreated >= LastMonthsFirstDate &&
r.dteCreated <= LastMonthsLastDate
select r.intRequestId);
Je ne peux tout simplement pas penser aux dates sans un interrupteur. Sauf si je suis aveugle et surplombe une méthode interne de le faire.
var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);
var first = month.AddMonths(-1);
var last = month.AddDays(-1);
En ligne si vous avez vraiment besoin d'une ou deux lignes.
La façon dont j'ai fait cela dans le passé est d’abord obtenir le premier jour de ce mois
dFirstDayOfThisMonth = DateTime.Today.AddDays( - ( DateTime.Today.Day - 1 ) );
Puis soustrayez un jour pour obtenir la fin du mois dernier
dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);
Puis soustrayez un mois pour obtenir le premier jour du mois précédent
dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);
utilisation de Fluent DateTime https://github.com/FluentDateTime/FluentDateTime
var lastMonth = 1.Months().Ago().Date;
var firstDayOfMonth = lastMonth.FirstDayOfMonth();
var lastDayOfMonth = lastMonth.LastDayOfMonth();
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);
J'utilise ce simple one-liner:
public static DateTime GetLastDayOfPreviousMonth(this DateTime date)
{
return date.AddDays(-date.Day);
}
Sachez que cela conserve l'heure.
Une approche utilisant des méthodes d'extension:
class Program
{
static void Main(string[] args)
{
DateTime t = DateTime.Now;
DateTime p = t.PreviousMonthFirstDay();
Console.WriteLine( p.ToShortDateString() );
p = t.PreviousMonthLastDay();
Console.WriteLine( p.ToShortDateString() );
Console.ReadKey();
}
}
public static class Helpers
{
public static DateTime PreviousMonthFirstDay( this DateTime currentDate )
{
DateTime d = currentDate.PreviousMonthLastDay();
return new DateTime( d.Year, d.Month, 1 );
}
public static DateTime PreviousMonthLastDay( this DateTime currentDate )
{
return new DateTime( currentDate.Year, currentDate.Month, 1 ).AddDays( -1 );
}
}
Voir ce lien http://www.codeplex.com/fluentdatetime pour certaines extensions inspirées de DateTime.
Le cas d'utilisation canonique dans le commerce électronique est la date d'expiration de la carte de crédit, MM/aa. Soustrayez une seconde au lieu d'un jour. Sinon, la carte apparaîtra comme expirée pour le dernier jour du mois d’expiration.
DateTime expiration = DateTime.Parse("07/2013");
DateTime endOfTheMonthExpiration = new DateTime(
expiration.Year, expiration.Month, 1).AddMonths(1).AddSeconds(-1);
Voici une réponse à la réponse de 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);
}
Vous pouvez appeler ça comme ça:
dateTimePickerFrom.Value = GetPreviousMonth(false);
dateTimePickerTo.Value = GetPreviousMonth(true);
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());
S'il y a une chance que vos dates/heures ne soient pas des dates de calendrier strictes, vous devriez envisager d'utiliser des comparaisons d'exclusion de date de fin ... Cela vous évitera de rater toute demande créée pendant la date du 31 janvier.
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);