पिछले महीने के पहले और अंतिम दिन को c # में प्राप्त करें


140

मैं एक आसान एक या दो लाइनर के बारे में नहीं सोच सकता जो पिछले महीनों को पहले दिन और आखिरी दिन मिलेगा।

मैं एक सर्वेक्षण वेब ऐप LINQ-ifying हूँ, और उन्होंने एक नई आवश्यकता को निचोड़ लिया।

सर्वेक्षण में पिछले महीने के सभी सेवा अनुरोध शामिल होने चाहिए। इसलिए यदि यह 15 अप्रैल है, तो मुझे सभी मार्च अनुरोध आईडी की आवश्यकता है।

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

मैं सिर्फ एक स्विच के बिना आसानी से तारीखों के बारे में नहीं सोच सकता। जब तक मैं अंधा हूं और इसे करने की एक आंतरिक विधि की अनदेखी करता हूं।

जवाबों:


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

यदि आपको वास्तव में एक या दो लाइनों की आवश्यकता है, तो उन्हें इन-लाइन करें।


2
IIRC DateTime.Today एक काफी महंगी कॉल है, इसलिए आप बेहतर मूल्य को पहले एक वेरिएबल में स्टोर करते हैं। वैसे भी अच्छा जवाब :)
Leandro López

2
@andleer यहाँ एक अच्छा पुस्तकालय जो काम करता है आप की तरह उल्लेख किया है fluentdatetime.codeplex.com
मैथ्यू लॉक

@MatthewLock, लिंक टूटा हुआ लगता है।
गुइलेर्मो गुतिरेज


2
मैं केवल यह बताना चाहूंगा कि यदि प्रविष्टियाँ पूर्ण पूर्ण तिथि का उपयोग करके संग्रहीत की जाती हैं तो यह क्वेरी महीने के अंतिम दिन 12:00 बजे के बाद शुरू होने वाले किसी भी को पुनः प्राप्त करने में विफल हो सकती है। आप पिछले पिछले महीने = var को पढ़ने के लिए अंतिम पंक्ति को बदलकर इसे हल कर सकते हैं। AddTicks (-1);
षष्ठी तिथि

23

जिस तरह से मैंने अतीत में किया है वह इस महीने का पहला दिन है

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

फिर पिछले महीने के अंत के लिए एक दिन घटाएं

dLastDayOfLastMonth = dFirstDayOfThisMonth.AddDays (-1);

फिर पिछले महीने के पहले दिन प्राप्त करने के लिए एक महीने को घटाएं

dFirstDayOfLastMonth = dFirstDayOfThisMonth.AddMonths(-1);

4
+1, लेकिन पांडित्यपूर्ण होने के लिए, आप बेहतर तरीके से DateTime.Today का एक बार मूल्यांकन कर रहे हैं और एक स्थानीय चर में संग्रहीत कर रहे हैं। यदि आपका कोड आधी रात से पहले नैनोसेकंड को क्रियान्वित करना शुरू कर देता है, तो DateTime.Today को लगातार दो कॉल अलग-अलग मान वापस कर सकते हैं।
जो

हां, धन्यवाद, आप सभी सही हैं, यहां तक ​​कि पांडित्य भी त्रुटि को ठीक करता है।
माइक डब्ल्यूएच

अच्छी तरह से संकलक आपको कम
पैदल चलने दें

1
return date.AddDays(-(date.Day-1))बनाम के रूप में तुलना की गई return new DateTime(date.Year, date.Month, 1);और 2000 से अधिक पुनरावृत्तियों के पहले प्रदर्शन का प्रदर्शन बेहतर है (923ms नए सिरे से बनाम 809 एक ही वस्तु को लौटाने पर)
Terry_Brown


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

DateTime.Today.Days -> 'System.DateTime' में 'Days' की परिभाषा नहीं है ...
andleer

5

मैं इस सरल वन-लाइनर का उपयोग करता हूं:

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

ज्ञात हो, कि यह समय को बनाए रखता है।


1
बस मैं जो चाहता था, संक्षिप्त अभिव्यक्ति मैं एक टर्नरी के अंदर उपयोग कर सकता था। धन्यवाद!
जो बैलार्ड

4

विस्तार विधियों का उपयोग करते हुए एक दृष्टिकोण:

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

कुछ प्रेरित DateTime एक्सटेंशन के लिए यह लिंक http://www.codeplex.com/fluentdatetime देखें ।


3

ई-कॉमर्स में विहित उपयोग मामला क्रेडिट कार्ड की समाप्ति तिथि, एमएम / वाई है। एक दिन के बजाय एक सेकंड घटाएं। अन्यथा समाप्ति माह के पूरे अंतिम दिन कार्ड समाप्त हो जाएगा।

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

1

यदि ऐसा कोई मौका है कि आपके डेटाटाइम्स सख्त कैलेंडर दिनांक नहीं हैं, तो आपको एंडेड बहिष्करण तुलनाओं का उपयोग करने पर विचार करना चाहिए ... यह आपको 31 जनवरी की तारीख के दौरान बनाए गए किसी भी अनुरोध को याद करने से रोक देगा।

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 पहली कॉल पर 2009-01-31 और दूसरी कॉल पर 2009-02-01 उपज देता है?
एमी बी

1

यह माइक डब्ल्यू का जवाब है:

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

आप इसे ऐसा कह सकते हैं:

dateTimePickerFrom.Value = GetPreviousMonth(false);
dateTimePickerTo.Value = GetPreviousMonth(true);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.