दी गई तारीख का सही सप्ताह नंबर प्राप्त करें


222

मैंने गोगल बहुत कुछ किया है और बहुत सारे समाधान पाए हैं, लेकिन उनमें से कोई भी मुझे 2012-12-31 के लिए सही सप्ताह का नंबर नहीं देता है। यहां तक ​​कि MSDN ( लिंक ) पर उदाहरण विफल रहता है।

2012-12-31 सोमवार है, इसलिए इसे सप्ताह 1 होना चाहिए, लेकिन मैंने जो भी कोशिश की वह मुझे 53 देता है। यहां कुछ तरीके दिए गए हैं, जिन्हें मैंने आजमाया है:

MDSN लाइब्रेरी से:

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;

return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

समाधान 2:

return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

समाधान 3:

CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;

अपडेट करें

निम्नलिखित विधि वास्तव में 1 है जब तारीख 2012-12-31 है। दूसरे शब्दों में, मेरी समस्या यह थी कि मेरे तरीके ISO-8601 मानक का पालन नहीं कर रहे थे।

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

4
वर्ष के अंत में सप्ताह 1 कैसे है? मेरा मतलब है, मैं देखता हूं कि आप इसे कहां प्राप्त करते हैं। लेकिन 53 मुझे समझ में आता है।
बेंजर 3

1
मेरे कोड स्निपेट्स में मुझे कल्चरइन्फो और सामान मिलता है। मैंने सोचा कि मेरा कार्यक्रम तब तक जानता है कि मैं किस कैलेंडर का उपयोग कर रहा हूं। (यहाँ जर्मनी में ३१ दिसंबर २०१२ का सप्ताह
१०१३ में है

यह कोड काम नहीं करता है क्योंकि इसे 31-dec-2016 की तारीखों के लिए प्रयास करना चाहिए उदाहरण के लिए या 1-
जून

@ cavej03 31-dec-2016 सप्ताह 52 है और GetIso8601WeekOfYear 52 रिटर्न करता है इसलिए मुझे लगता है कि यह सही ढंग से काम करता है।
मुफ्लिक्स

जवाबों:


310

जैसा कि इस MSDN पृष्ठ में नोट किया गया है कि ISO8601 सप्ताह और .Net सप्ताह नंबरिंग के बीच थोड़ा अंतर है।

आप MSDN ब्लॉग में इस लेख को बेहतर स्पष्टीकरण के लिए संदर्भित कर सकते हैं: " Microsoft में .net 8601 वीक का प्रारूप प्रारूप। "

सीधे शब्दों में कहें, .Net आईएसओ मानक नहीं होने पर हफ्तों को सालों तक विभाजित होने की अनुमति देता है। लेख में वर्ष के अंतिम सप्ताह के लिए सही आईएसओ 8601 सप्ताह संख्या प्राप्त करने के लिए एक सरल कार्य भी है।

अद्यतन निम्न विधि वास्तव 2012-12-31में आईएसओ 8601 (जैसे जर्मनी) में सही है , जिसके लिए 1 लौटाता है ।

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
} 

1
@il_guru अगर मैं चाहूँ तो सप्ताह रविवार से शुरू होगा ?? क्या मैं सभी "सोमवार" को "रविवार" से बदल देता हूँ ??
User2012384

2
@ User2012384 फी, अगर आप ISO8601 मानक का पालन करना चाहते हैं तो firstDayOfWeek को हमेशा सोमवार होना चाहिए।
स्टारकेकर

1
@il_guru आपको भी इस "धोखा" की ज़रूरत नहीं है अगर, क्या आप? जहाँ तक मैं बता सकता हूँ "GetWeekOfYear (समय, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);" ठीक काम करता है।
स्टारकेकर

2
यदि आप Microsoft (.Net) में दूसरी कड़ी (ISO 8601 वीक ऑफ ईयर फॉर्मेट) देखते हैं, तो आप अपने प्रश्न का उत्तर सीधे Microsoft से पा सकते हैं। एक उदाहरण सोमवार 31/12/2007 है: .Net फ़ंक्शन के साथ यह 2007 के सप्ताह नंबर 53 पर वापस आ जाएगा, जबकि आईएसओ मानक के लिए यह 2008 के सप्ताह नंबर 1 है
il_guru

3
मैंने वर्ष 2012 से 2018 के लिए सही होने के लिए इसे मैन्युअल रूप से सत्यापित किया है (यह मानते हुए कि epochconverter.com सही है)। हम सभी को इस साल खुश होना चाहिए कि 2018 का सप्ताह 1 वास्तव में जनवरी के पहले दिन के लिए शुरू हुआ!
ईदन

32

एक वर्ष में 52 सप्ताह से अधिक हो सकते हैं। प्रत्येक वर्ष में 52 पूर्ण सप्ताह + 1 या +2 (लीप वर्ष) अतिरिक्त दिन होते हैं। वे 53 वें सप्ताह के लिए बनाते हैं।

  • 52 सप्ताह * 7 दिन = 364 दिन।

इसलिए प्रत्येक वर्ष के लिए आपके पास कम से कम एक अतिरिक्त दिन होता है। दो लीप वर्ष के लिए। क्या इन अतिरिक्त दिनों को उनके अलग सप्ताह के रूप में गिना जाता है?

कितने सप्ताह वास्तव में आपके सप्ताह के शुरुआती दिन पर निर्भर करते हैं। आइए इस पर 2012 के लिए विचार करें।

  • यूएस (रविवार -> शनिवार): 52 सप्ताह + 2012-12-30 और 2012-12-31 के लिए 2 दिन का एक सप्ताह। यह कुल 53 सप्ताह का परिणाम है। इस वर्ष के अंतिम दो दिन (रविवार + सोमवार) अपना छोटा सप्ताह बनाते हैं।

सप्ताह के पहले दिन के रूप में इसका उपयोग करने के लिए अपनी वर्तमान संस्कृति की सेटिंग देखें।

जैसा कि आप देखते हैं कि परिणामस्वरूप 53 प्राप्त करना सामान्य है।

  • यूरोप (सोमवार -> रविवार): 2 जनवरी (2012-1-2) पहला सोमवार है, इसलिए यह पहले सप्ताह का पहला दिन है। 1 जनवरी के लिए सप्ताह संख्या पूछें और आपको 52 वापस मिल जाएंगे क्योंकि यह पिछले सप्ताह 2011 का हिस्सा माना जाता है।

54 वाँ सप्ताह होना भी संभव है। हर 28 साल में होता है जब 1 जनवरी और 31 दिसंबर को अलग सप्ताह के रूप में माना जाता है। यह एक लीप वर्ष भी होना चाहिए।

उदाहरण के लिए, वर्ष 2000 में 54 सप्ताह थे। 1 जनवरी (शनिवार) पहला एक सप्ताह का दिन था, और 31 दिसंबर (सूरज) दूसरा एक सप्ताह का दिन था।

var d = new DateTime(2012, 12, 31);
CultureInfo cul = CultureInfo.CurrentCulture;

var firstDayWeek = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int weekNum = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int year = weekNum == 52 && d.Month == 1 ? d.Year - 1 : d.Year;
Console.WriteLine("Year: {0} Week: {1}", year, weekNum);

प्रिंट आउट: वर्ष: 2012 सप्ताह: 54

ऊपर दिए गए उदाहरण में CalendarWeekRule को बदलें FirstFullWeek या FirstFourDayWeek पर और आपको 53 मिलेंगे। चलिए सोमवार का दिन शुरू करते हैं, क्योंकि हम जर्मनी के साथ काम कर रहे हैं।

तो सप्ताह 53 सोमवार 2012-12-31 को शुरू होता है, एक दिन रहता है और फिर रुक जाता है।

53 सही उत्तर है। यदि इसे आज़माना चाहते हैं तो संस्कृति को जर्मनी में बदलें।

CultureInfo cul = CultureInfo.GetCultureInfo("de-DE");

मुझे पता है कि यह संभव है कि 53 सप्ताह हों। लेकिन जब आपके पास रविवार (12/30) और सोमवार (12/31) है, तो आप यूएस में 53 वें सप्ताह के भाग के रूप में थिस्डे (01/01) को भी नहीं गिनेंगे?
अंबरलैम्प्स

मैंने कभी ५४ वां सप्ताह नहीं देखा!
अंबरलैम्प्स

कुछ राजकोषीय सॉफ्टवेयर पैकेज उनके पास हैं।
क्रिस्टोफ गेर्स

ठीक है, मुझे पता चला कि यह अमेरिकी कैलेंडर में संभव है, लेकिन जर्मन कैलेंडर में ऐसा नहीं होगा।
अंबरलाम्प्स

1
इस मुद्दे पर आपके गहन विचारों के लिए +1, लेकिन एक अलग उत्तर में प्रदान की गई ब्लॉग प्रविष्टि में कोड स्निपेट ने वास्तव में मेरी समस्या हल कर दी।
अंबरलम्प्स

22

यह रास्ता है:

public int GetWeekNumber()
{
    CultureInfo ciCurr = CultureInfo.CurrentCulture;
    int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return weekNum;
}

के लिए सबसे महत्वपूर्ण है CalendarWeekRule पैरामीटर है।

यहाँ देखें: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalendarWeekRule);k(TargetFrameworkMoniker-.NETFramework


3
"कई लोगों ने देखा है कि Calendar.GetWeekOfYear () लगभग ISO 8601 सप्ताह की तरह है, जब CalendarWeekRule.FirstFourDayWeek और DayOfWeek.Monday को पास कर दिया जाता है, हालांकि यह थोड़ा अलग है। विशेष रूप से ISO 8601 में हमेशा 7 दिन होते हैं।" blogs.msdn microsoft.com/shawnste/2006/01/24/…
Juha Palomäki

1
आपका लिंक इटालियन में है
radbyx

नए DateTime (2000,12,31) के लिए यह सिर्फ 52 है?
लेस्ज़ेक पी

18

खुशखबरी! एक पुल जोड़ने का अनुरोधSystem.Globalization.ISOWeek.NET कोर में का केवल विलय कर दिया गया था और वर्तमान में 3.0 रिलीज के लिए स्लेट किया गया है। उम्मीद है कि यह एक बहुत अधिक दूर के भविष्य में अन्य .NET प्लेटफार्मों के लिए प्रचार करेगा।

इस प्रकार के निम्नलिखित हस्ताक्षर हैं, जिन्हें अधिकांश आईएसओ सप्ताह की जरूरतों को कवर करना चाहिए :

namespace System.Globalization
{
    public static class ISOWeek
    {
        public static int GetWeekOfYear(DateTime date);
        public static int GetWeeksInYear(int year);
        public static int GetYear(DateTime date);
        public static DateTime GetYearEnd(int year);
        public static DateTime GetYearStart(int year);
        public static DateTime ToDateTime(int year, int week, DayOfWeek dayOfWeek);
    }
}

आप स्रोत कोड यहां पा सकते हैं ।

अद्यतन : इन एपीआई को .NET मानक के 2.1 संस्करण में भी शामिल किया गया है


कोई विचार जब v 3.0 जारी किया जाएगा?
जैक्स

"हम इस साल के अंत में .NET कोर 3 का पहला पूर्वावलोकन और 2019 में अंतिम संस्करण जारी करने की योजना बना रहे हैं।" ( रोडमैप ब्लॉग पोस्ट से )
khellang

@khellang मैं डेटटाइम के आधार पर एक महीने में अध्यादेशीय सप्ताह कैसे प्राप्त कर सकता हूं? सप्ताह 33 प्राप्त करने के बजाय मैं सप्ताह 2 (क्योंकि सप्ताह 33 अगस्त में सप्ताह 2 है) देखना चाहूंगा। stackoverflow.com/questions/58039103/…
रॉक्सी'प्रो

11

चूँकि ऐसा प्रतीत नहीं होता है कि एक .Net-संस्कृति है जो सही ISO-8601 सप्ताह की संख्या प्राप्त करती है, मैं बिल्ट-इन सप्ताह निर्धारण को पूरी तरह से दरकिनार कर दूंगा, और आंशिक रूप से सही करने के प्रयास के बजाय मैन्युअल रूप से गणना करूँगा। परिणाम।

मैंने जो समाप्त किया वह निम्नलिखित विस्तार विधि है:

/// <summary>
/// Converts a date to a week number.
/// ISO 8601 week 1 is the week that contains the first Thursday that year.
/// </summary>
public static int ToIso8601Weeknumber(this DateTime date)
{
    var thursday = date.AddDays(3 - date.DayOfWeek.DayOffset());
    return (thursday.DayOfYear - 1) / 7 + 1;
}

/// <summary>
/// Converts a week number to a date.
/// Note: Week 1 of a year may start in the previous year.
/// ISO 8601 week 1 is the week that contains the first Thursday that year, so
/// if December 28 is a Monday, December 31 is a Thursday,
/// and week 1 starts January 4.
/// If December 28 is a later day in the week, week 1 starts earlier.
/// If December 28 is a Sunday, it is in the same week as Thursday January 1.
/// </summary>
public static DateTime FromIso8601Weeknumber(int weekNumber, int? year = null, DayOfWeek day = DayOfWeek.Monday)
{
    var dec28 = new DateTime((year ?? DateTime.Today.Year) - 1, 12, 28);
    var monday = dec28.AddDays(7 * weekNumber - dec28.DayOfWeek.DayOffset());
    return monday.AddDays(day.DayOffset());
}

/// <summary>
/// Iso8601 weeks start on Monday. This returns 0 for Monday.
/// </summary>
private static int DayOffset(this DayOfWeek weekDay)
{
    return ((int)weekDay + 6) % 7;
}

सबसे पहले, ((int)date.DayOfWeek + 6) % 7)कार्यदिवस संख्या, 0 = सोमवार, 6 = रविवार निर्धारित करता है।

date.AddDays(-((int)date.DayOfWeek + 6) % 7) निर्धारित सप्ताह संख्या से पहले सोमवार की तिथि निर्धारित करता है।

तीन दिनों के बाद लक्ष्य थर्सडे है, जो निर्धारित करता है कि सप्ताह किस वर्ष में है।

यदि आप वर्ष के भीतर (शून्य आधारित) दिन-संख्या को सात (गोल नीचे) से विभाजित करते हैं, तो आपको वर्ष में (शून्य आधारित) सप्ताह संख्या मिलती है।

सी # में, पूर्णांक गणना परिणाम अनुमानित रूप से नीचे हैं।


1
यह अब तक का सबसे अच्छा समाधान है, लेकिन मैं इसे करने का थोड़ा अलग तरीका बताऊंगा: डेटटाइम प्रोलेप्टिक ग्रेगोरियन कैलेंडर पर आधारित है - अर्थात यह ग्रेगोरियन कैलेंडर को वर्ष 1 तक विस्तारित करता है। 1 जनवरी 0001 को होता है सोमवार। Ticks1 जनवरी 0001 से 100-नैनोसेकंड वेतन वृद्धि की संख्या है। यह देखते हुए कि एक दिन में हम 86,400 सेकंड लिख सकते हैं:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
एड्रियन एस

5

.NET 3.0 और बाद में आप ISOWeek.GetWeekOfDate-Method का उपयोग कर सकते हैं ।

ध्यान दें कि वर्ष + सप्ताह संख्या प्रारूप में वर्ष उस वर्ष के वर्ष से भिन्न हो सकता है DateTimeजो वर्ष सीमा को पार करता है।


3

C # से Powershell पोर्ट के लिए il_guru से ऊपर कोड :

function GetWeekOfYear([datetime] $inputDate)
{
   $day = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetDayOfWeek($inputDate)
   if (($day -ge [System.DayOfWeek]::Monday) -and ($day -le [System.DayOfWeek]::Wednesday))
   {
      $inputDate = $inputDate.AddDays(3)
   }

   # Return the week of our adjusted day
   $weekofYear = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetWeekOfYear($inputDate, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [System.DayOfWeek]::Monday)
   return $weekofYear
}

1
क्या आप अपना कोड समझा सकते हैं? कोड-ओनली उत्तर आमतौर पर StackOverflow पर स्वीकार्य नहीं होते हैं, और जैसे हटाए जाने के लिए उत्तरदायी होते हैं।
वाई हा ली

@Wai हा ली कोड पहले से ही समझाया गया है। Il_guru से ऊपर की पोस्ट देखें। मैंने उनके कोड को पावरशेल में पोर्ट किया, इसलिए अन्य लोग इसे पावरशेल में उपयोग कर सकते हैं क्योंकि पावरशेल में अब तक कोई अच्छा समाधान नहीं है।
रेनर

यदि आपने ऐसा किया है, तो आपको मूल लेखक को जवाब में ही क्रेडिट करना चाहिए। आपके द्वारा प्रस्तुत उत्तर में बेहतर टिप्पणियां हैं, जिन्हें आपने संभवतः हटा दिया है। इसके अलावा, यह प्रश्न का उत्तर नहीं है क्योंकि प्रश्न में PowerShell का उल्लेख नहीं किया गया है।
वाई हा ली

1
मैंने अब @Wai हा ली। प्रश्न पहले से ही उत्तर के रूप में चिह्नित है, इसलिए यह अन्य भाषा में लिखा गया एक ही समाधान होगा। मैंने लोगों के लिए एक एहसान किया, जो Powershell भाषा में एक समाधान की तलाश कर रहे हैं (मैं Powershell में एक समाधान के लिए कठिन दिख रहा था, लेकिन मुझे जो मिला वह C # में एक समाधान था)। विचार वही रहता है और लेखक को इसका श्रेय जाता है।
रेनर

2

सी # और डेटटाइम क्लास का उपयोग करके सप्ताह की संख्या आईएसओ 8601 शैली का निर्धारण करने का सबसे आसान तरीका।

यह पूछें: वर्ष के कितने-कितने-नैतिक दिन इस सप्ताह के दिन हैं? उत्तर वांछित सप्ताह संख्या के बराबर है।

var dayOfWeek = (int)moment.DayOfWeek;
// Make monday the first day of the week
if (--dayOfWeek < 0)
    dayOfWeek = 6;
// The whole nr of weeks before this thursday plus one is the week number
var weekNumber = (moment.AddDays(3 - dayOfWeek).DayOfYear - 1) / 7 + 1;

1
var cultureInfo = CultureInfo.CurrentCulture;
var calendar = cultureInfo.Calendar;

var calendarWeekRule = cultureInfo.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = cultureInfo.DateTimeFormat.FirstDayOfWeek;
var lastDayOfWeek = cultureInfo.LCID == 1033 //En-us
                    ? DayOfWeek.Saturday
                    : DayOfWeek.Sunday;

var lastDayOfYear = new DateTime(date.Year, 12, 31);

var weekNumber = calendar.GetWeekOfYear(date, calendarWeekRule, firstDayOfWeek);

 //Check if this is the last week in the year and it doesn`t occupy the whole week
return weekNumber == 53 && lastDayOfYear.DayOfWeek != lastDayOfWeek 
       ? 1  
       : weekNumber;

यह अमेरिका और रूसी दोनों संस्कृतियों के लिए अच्छा काम करता है। आईएसओ 8601 भी सही होगा, `कारण रूसी सप्ताह सोमवार से शुरू होता है।


1

यहाँ il_guru के उत्तर का एक विस्तार संस्करण और अशक्त संस्करण है ।

एक्सटेंशन:

public static int GetIso8601WeekOfYear(this DateTime time)
{
    var day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

नल:

public static int? GetIso8601WeekOfYear(this DateTime? time)
{
    return time?.GetIso8601WeekOfYear();
}

उपयोगों:

new DateTime(2019, 03, 15).GetIso8601WeekOfYear(); //returns 11
((DateTime?) new DateTime(2019, 03, 15)).GetIso8601WeekOfYear(); //returns 11
((DateTime?) null).GetIso8601WeekOfYear(); //returns null

0

सवाल यह है: यदि आप एक सप्ताह 2012 या 2013 में हैं तो आप कैसे परिभाषित करेंगे? आपका अनुमान, मेरा अनुमान है कि चूंकि सप्ताह के ६ दिन २०१३ में हैं, इसलिए इस सप्ताह को २०१३ के पहले सप्ताह के रूप में चिह्नित किया जाना चाहिए।

यकीन नहीं होता अगर यह जाने का सही तरीका है। वह सप्ताह 2012 को शुरू हुआ था (सोमवार 31 दिसंबर को), इसलिए इसे 2012 के अंतिम सप्ताह के रूप में चिह्नित किया जाना चाहिए, इसलिए यह 2012 का 53 वां होना चाहिए। 2013 का पहला सप्ताह 7 वें सोमवार से शुरू होना चाहिए।

अब, आप सप्ताह की जानकारी के दिन का उपयोग करके किनारे सप्ताह (वर्ष के पहले और अंतिम सप्ताह) के विशेष मामले को संभाल सकते हैं। यह सब आपके तर्क पर निर्भर करता है।


ठीक है, मैं आपकी बात देख सकता हूं। बात तब है जब मैं अपने किसी भी तरीके में 2013/01/07 का उपयोग करता हूं, यह सप्ताह 2 कहता है। इसलिए, 2012/12/31 सप्ताह 53 है और 2013/01/07 सप्ताह 2 है। आप सोच सकते हैं कि कोई सप्ताह नहीं है 1 2013 का। लेकिन जब मैं 2013/01/01 की कोशिश करता हूं तो यह सप्ताह 1 कहता है
एम्बरब्लैप्स

0
  DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
  DateTime date1 = new DateTime(2011, 1, 1);
  Calendar cal = dfi.Calendar;

  Console.WriteLine("{0:d}: Week {1} ({2})", date1, 
                    cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
                                      dfi.FirstDayOfWeek),
                    cal.ToString().Substring(cal.ToString().LastIndexOf(".") + 1));      

0

Il_guru के उत्तर के आधार पर, मैंने अपनी आवश्यकताओं के लिए इस संस्करण का निर्माण किया जो वर्ष घटक को भी लौटाता है।

    /// <summary>
    /// This presumes that weeks start with Monday.
    /// Week 1 is the 1st week of the year with a Thursday in it.
    /// </summary>
    /// <param name="time">The date to calculate the weeknumber for.</param>
    /// <returns>The year and weeknumber</returns>
    /// <remarks>
    /// Based on Stack Overflow Answer: https://stackoverflow.com/a/11155102
    /// </remarks>
    public static (short year, byte week) GetIso8601WeekOfYear(DateTime time)
    {
        // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll
        // be the same week# as whatever Thursday, Friday or Saturday are,
        // and we always get those right
        DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
        if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
        {
            time = time.AddDays(3);
        }
        // Return the week of our adjusted day
        var week = (byte)CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        return ((short)(week >= 52 & time.Month == 1 ? time.Year - 1 : time.Year), week);
    }

0

इन दो तरीकों से मदद मिलेगी, सोमवार को हमारा सप्ताह शुरू होता है

/// <summary>
    /// Returns the weekId
    /// </summary>
    /// <param name="DateTimeReference"></param>
    /// <returns>Returns the current week id</returns>
    public static DateTime GetDateFromWeek(int WeekReference)
    {
        //365 leap
        int DaysOffset = 0;
        if (WeekReference > 1)
        {
            DaysOffset = 7;
            WeekReference = WeekReference - 1;
        }
        DateTime DT = new DateTime(DateTime.Now.Year, 1, 1);
        int CurrentYear = DT.Year;
        DateTime SelectedDateTime = DateTime.MinValue;

        while (CurrentYear == DT.Year)
        {
            int TheWeek = WeekReportData.GetWeekId(DT);
            if (TheWeek == WeekReference)
            {
                SelectedDateTime = DT;
                break;
            }
            DT = DT.AddDays(1.0D);
        }

        if (SelectedDateTime == DateTime.MinValue)
        {
            throw new Exception("Please check week");
        }

        return SelectedDateTime.AddDays(DaysOffset);
    }
/// <summary>
    /// Returns the weekId
    /// </summary>
    /// <param name="DateTimeReference"></param>
    /// <returns>Returns the current week id</returns>
    public static int GetWeekId(DateTime DateTimeReference)
    {
        CultureInfo ciCurr = CultureInfo.InvariantCulture;
        int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTimeReference,
        CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);
        return weekNum;
    }

-1

एक वर्ष में एक गोद वर्ष के मामले में 52 सप्ताह और 1 दिन या 2 है (52 x 7 = 364)। 2012-12-31 सप्ताह 53 होगा, एक सप्ताह जिसमें केवल 2 दिन होंगे क्योंकि 2012 एक गोद वर्ष है।


यह गलत है। वर्ष के सप्ताह का पहला दिन सप्ताह के किसी भी दिन गिर सकता है, इस बात पर निर्भर करता है कि आप सप्ताह कैसे गिनते हैं, वर्ष का 54 वां सप्ताह हो सकता है।
krowe2

-2
public int GetWeekNumber()
{
   CultureInfo ciCurr = CultureInfo.CurrentCulture;
   int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, 
   CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
   return weekNum;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.