Önceki ayın ilk ve son gün tarihlerini c # ile alın


140

Önceki ayların ilk gününü ve son gününü alacak kolay bir ya da iki astar düşünemiyorum.

Ben bir anket web uygulaması LINQ-ifying ve onlar yeni bir gereksinimi sıktı.

Anket, bir önceki aya ait tüm servis taleplerini içermelidir. 15 Nisan ise, tüm Marches istek kimliklerine ihtiyacım var.

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

Geçiş yapmadan tarihleri ​​kolayca düşünemiyorum. Kör olmadıkça ve bunu yapmanın içsel bir yöntemine bakmadığım sürece.

Yanıtlar:


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

Gerçekten bir veya iki hatta ihtiyacınız varsa bunları sıraya alın.


2
IIRC DateTime.Today oldukça pahalı bir çağrıdır, bu yüzden değeri önce bir değişkende daha iyi saklarsınız. Yine de iyi cevap :)
Leandro López

2
@andleer bahsettiğiniz gibi çalışan güzel bir kütüphane burada fluentdatetime.codeplex.com
Matthew Lock

@MatthewLock, bağlantı kopmuş gibi görünüyor.
Guillermo Gutiérrez


2
Sadece girişler aa tam datetime kullanılarak saklanırsa, bu sorgu ayın son günü 00: 00'dan sonra başlayan herhangi bir almak için başarısız olabilir işaret etmek istiyorum. Bunu, var last = month okumak için son satırı değiştirerek çözebilirsiniz.AddTicks (-1);
SixOThree

23

Bunu geçmişte yaptığım yol, ilk olarak bu ayın ilk gününü almak

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

Sonra geçen ayın sonunu almak için bir gün çıkarın

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

Sonra bir önceki ayın ilk gününü almak için bir ay çıkarın

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);

4
+ 1, ancak bilgiç olmak için DateTime'ı daha iyi değerlendiriyorsunuz. Bugün bir kez ve yerel bir değişkente saklanıyor. Kodunuz gece yarısından önce bir nanosaniye çalıştırmaya başlarsa, DateTime.Today öğesine arka arkaya iki çağrı farklı değerler döndürebilir.
Joe

Evet, teşekkürler, hepiniz düzeltin, bilgiçlik taslağı bile hatayı düzelttim.
MikeW

derleyici size daha az
bilgiç

1
karşılaştırılması gibi upvoted return date.AddDays(-(date.Day-1))karşı return new DateTime(date.Year, date.Month, 1);ve birinci üzerinde 2.000 yineleme performansı daha da (923ms aynı nesneyi geri 809ms karşı kadar newing)
Terry_Brown


9
DateTime LastMonthLastDate = DateTime.Today.AddDays(0 - DateTime.Today.Day);
DateTime LastMonthFirstDate = LastMonthLastDate.AddDays(1 - LastMonthLastDate.Day);

DateTime.Today.Days -> 'System.DateTime', 'Günler' için bir tanım içermiyor ...
andleer

5

Bu basit tek astarı kullanıyorum:

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

Unutmayın, zamanı korur.


1
Tam istediğim gibi, bir üçlü içinde kullanabileceğim kısa bir ifade. Teşekkürler!
Joe Ballard

4

Genişletme yöntemlerini kullanan bir yaklaşım:

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 );
    }
}

İlham veren DateTime uzantıları için bu bağlantıya http://www.codeplex.com/fluentdatetime bakın .


3

E-ticarette standart kullanım durumu kredi kartı son kullanma tarihleri ​​olan AA / yy'dir. Bir gün yerine bir saniye çıkarın. Aksi takdirde, kartın geçerlilik süresi sona erme ayının son günü boyunca sona erer.

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

1

Tarihlerinizin katı takvim tarihleri ​​olmaması ihtimali varsa, bitiş tarihi hariç tutma karşılaştırmaları kullanmayı düşünmelisiniz ... Bu, 31 Ocak tarihinde oluşturulan istekleri kaçırmanızı önleyecektir.

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
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
DateTime.Now ilk çağrıda 2009-01-31 ve ikinci çağrıda 2009-02-01 verirse ne olur?
Amy B

1

Mike W'nin cevabı şu:

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);
}

Şöyle diyebilirsiniz:

dateTimePickerFrom.Value = GetPreviousMonth(false);
dateTimePickerTo.Value = GetPreviousMonth(true);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.