web-dev-qa-db-fra.com

Obtenez les dates du premier et du dernier jour du mois précédent en c #

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.

128
Jeremy Boyd
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.

281
andleer

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);
22
MikeW

utilisation de Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

        var lastMonth = 1.Months().Ago().Date;
        var firstDayOfMonth = lastMonth.FirstDayOfMonth();
        var lastDayOfMonth = lastMonth.LastDayOfMonth();
11
Simon
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);
8
Franci Penov

J'utilise ce simple one-liner:

public static DateTime GetLastDayOfPreviousMonth(this DateTime date)
{
    return date.AddDays(-date.Day);
}

Sachez que cela conserve l'heure.

5
CodeMonkey

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.

4
rp.

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);
3
MartinLeo

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);
1
B. Clay Shannon
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());
1
Maksym Gontar

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);
1
Amy B