รับหมายเลขสัปดาห์ที่ถูกต้องของวันที่ที่กำหนด


222

ฉันใช้ Google เป็นจำนวนมากและพบวิธีแก้ปัญหามากมาย แต่ไม่มีใครให้หมายเลขในสัปดาห์ที่ถูกต้องสำหรับ 2012-12-31 แม้แต่ตัวอย่างบน MSDN ( ลิงค์ ) ก็ล้มเหลว

2012-12-31 คือวันจันทร์จึงควรเป็นสัปดาห์ที่ 1 แต่ทุกวิธีที่ฉันลองให้ฉัน 53 นี่คือวิธีการบางอย่างที่ฉันได้ลอง:

จาก MDSN Library:

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 มีเหตุผลสำหรับฉัน
benjer3

1
ในตัวอย่างโค้ดของฉันฉันได้รับ CultureInfo และสิ่งต่างๆ ฉันคิดว่าโปรแกรมของฉันรู้แล้วว่าฉันใช้ปฏิทินอะไร (ที่นี่ในเยอรมนีวันที่ 31 ธันวาคม 2012 อยู่ในสัปดาห์ที่ 1 ของปี 2013)
Amberlamps

รหัสนี้ใช้งานไม่ได้เนื่องจากควรลองวันที่ 31 ธ.ค. 2559 หรือ 1-jan-2016
cavej03

@ cavej03 31-Dec-2016 คือ 52 สัปดาห์และ GetIso8601WeekOfYear ส่งคืน 52 ดังนั้นฉันเดาว่ามันทำงานได้อย่างถูกต้อง
Muflix

คำตอบ:


311

ดังที่ระบุไว้ในหน้า MSDN นี้มีความแตกต่างกันเล็กน้อยระหว่าง ISO8601 สัปดาห์และ. Net สัปดาห์ที่นับ

คุณสามารถอ้างถึงบทความนี้ในบล็อก MSDN สำหรับคำอธิบายที่ดีกว่า: " รูปแบบ ISO 8601 สัปดาห์แห่งปีใน Microsoft .Net "

เพียงแค่ใส่. Net จะอนุญาตให้แบ่งสัปดาห์เป็นเวลาหลายปีในขณะที่มาตรฐาน ISO ไม่สามารถทำได้ ในบทความยังมีฟังก์ชั่นง่าย ๆ เพื่อรับหมายเลข ISO 8601 สัปดาห์ที่ถูกต้องสำหรับสัปดาห์สุดท้ายของปี

อัปเดตวิธีการต่อไปนี้จะคืนค่า 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);
} 

1
@il_guru เกิดอะไรขึ้นถ้าฉันต้องการให้สัปดาห์เริ่มต้นด้วยวันอาทิตย์ ?? ฉันจะแทนที่ "วันจันทร์" ทั้งหมดด้วย "วันอาทิตย์" ได้หรือไม่?
User2012384

2
@ User2012384 fyi ถ้าคุณต้องการที่จะปฏิบัติตามมาตรฐาน ISO8601 the firstDayOfWeek ควรเป็นวันจันทร์เสมอ
Starceaker

1
@il_guru คุณไม่จำเป็นต้องมี "cheat" นี้ด้วยใช่ไหม? เท่าที่ฉันสามารถบอก "GetWeekOfYear (เวลา, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);" ทำงานได้ดี
Starceaker

2
หากคุณดูลิงค์ที่สอง (รูปแบบ ISO 8601 Week of Year ใน Microsoft .Net) คุณสามารถค้นหาคำตอบสำหรับคำถามของคุณได้โดยตรงจาก Microsoft ตัวอย่างคือวันจันทร์ที่ 31/12/2550: ด้วยฟังก์ชัน. Net มันจะคืนค่าสัปดาห์ที่ 53 ของปี 2007 ในขณะที่มาตรฐาน ISO จะเป็นสัปดาห์ที่ 1 ของปี 2008
il_guru

3
ฉันตรวจสอบด้วยตนเองแล้วว่าสิ่งนี้ถูกต้องสำหรับปี 2555 ถึงปี 2561 (สมมติว่า epochconverter.com ถูกต้อง) เราทุกคนควรชื่นชมยินดีในปีนี้ในสัปดาห์ที่ 1 ของปี 2018 ที่จริงเริ่มในวันที่ 1 มกราคมครั้งเดียว!
Aidan

32

อาจมีมากกว่า 52 สัปดาห์ในหนึ่งปี ในแต่ละปีมี 52 สัปดาห์เต็ม + 1 หรือ +2 (ปีอธิกสุรทิน) วันพิเศษ พวกเขาประกอบกันเป็นสัปดาห์ที่ 53

  • 52 สัปดาห์ * 7 วัน = 364 วัน

ดังนั้นในแต่ละปีคุณมีอย่างน้อยหนึ่งวันต่อวัน สองปีอธิกสุรทิน วันพิเศษเหล่านี้ถูกนับเป็นสัปดาห์แยกจากกัน

กี่สัปดาห์ขึ้นอยู่กับวันเริ่มต้นของสัปดาห์ ลองพิจารณาสิ่งนี้สำหรับปี 2012

  • สหรัฐอเมริกา (วันอาทิตย์ -> วันเสาร์): 52 สัปดาห์ + หนึ่งสัปดาห์สั้น ๆ 2 วันสำหรับ 2012-12-30 และ 2012-12-31 ส่งผลให้ทั้งหมด 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) คุณไม่นับวันพฤหัสบดี (01/01) เป็นส่วนหนึ่งของสัปดาห์ที่ 53 ในสหรัฐอเมริกาหรือไม่
Amberlamps

ฉันไม่เคยเห็นสัปดาห์ที่ 54!
Amberlamps

แพคเกจซอฟต์แวร์ทางการเงินบางอย่างมีอยู่
Christophe Geers

โอเคฉันพบว่าเป็นไปได้ในปฏิทินสหรัฐอเมริกา แต่จะไม่เกิดขึ้นในปฏิทินเยอรมัน
Amberlamps

1
+1 สำหรับความคิดลึกของคุณเกี่ยวกับปัญหา แต่ข้อมูลโค้ดในรายการบล็อกที่ให้ไว้ในคำตอบที่แตกต่างกันแก้ปัญหาของฉันได้จริง
Amberlamps

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 วันต่อสัปดาห์" บล็อก microsoft.com/shawnste/2006/01/24/…
Juha Palomäki

1
ลิงก์ของคุณเป็นภาษาอิตาลี
radbyx

สำหรับ DateTime ใหม่ (2000,12,31) จะส่งกลับเพียง 52
Leszek P

18

ข่าวดี! คำขอดึงเพิ่มSystem.Globalization.ISOWeekเพื่อ .NET หลักรวมเพียงและมีกำหนดในขณะนี้สำหรับการเปิดตัว 3.0 หวังว่ามันจะแพร่กระจายไปยังแพลตฟอร์ม NET อื่น ๆ ในอนาคตไม่ไกลเกินไป

ชนิดมีลายเซ็นต่อไปนี้ซึ่งควรครอบคลุมความต้องการISO สัปดาห์ส่วนใหญ่:

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

คุณสามารถค้นหารหัสที่มาที่นี่

UPDATE : API เหล่านี้ยังได้รับการรวมอยู่ในรุ่น 2.1 .NET มาตรฐาน


ความคิดใด ๆ เมื่อ v 3.0 จะเปิดตัว?
Jacques

"เราวางแผนที่จะวางจำหน่ายพรีวิว. NET Core 3 ครั้งแรกในปีนี้และเวอร์ชั่นสุดท้ายในปี 2562" (จากโพสต์บล็อกแผนงาน )
khellang

@hellang ฉันจะได้รับสัปดาห์ลำดับในเดือนตามวันที่และเวลาได้อย่างไร แทนที่จะได้รับ 33 สัปดาห์ฉันอยากเห็นสัปดาห์ที่ 2 (เพราะสัปดาห์ที่ 33 คือสัปดาห์ที่ 2 ในเดือนสิงหาคม) stackoverflow.com/questions/58039103/…
Roxy'Pro

11

เนื่องจากดูเหมือนว่าจะไม่เป็น. Net-culture ที่ให้ค่าหมายเลข 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) กำหนดวันที่ของวันจันทร์ล่วงหน้าหมายเลขสัปดาห์ที่ร้องขอ

สามวันต่อมาคือเป้าหมายของวันพฤหัสบดีซึ่งเป็นตัวกำหนดปีของสัปดาห์

หากคุณหารจำนวนวันตาม (เป็นศูนย์) ภายในปีเจ็ด (ปัดเศษลง) คุณจะได้รับหมายเลขสัปดาห์ตาม (เป็นศูนย์) ในปี

ใน c # ผลการคำนวณจำนวนเต็มจะปัดลงโดยปริยาย


1
นี่เป็นทางออกที่ดีที่สุด แต่ฉันจะชี้ให้เห็นวิธีที่แตกต่างออกไปเล็กน้อย: DateTime ขึ้นอยู่กับปฏิทินเกรโกเรียนที่เป็นผู้ใหญ่ - นั่นคือขยายปฏิทินเกรกอเรียนกลับไปเป็นปีที่ 1 วันที่ 1 มกราคม 0001 วันจันทร์ Ticksคือจำนวนที่เพิ่มขึ้น 100 นาโนวินาทีตั้งแต่วันที่ 1 มกราคม 0001 เนื่องจากมี 86,400 วินาทีต่อวันเราสามารถเขียนได้:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
Adrian S

5

ใน .NET 3.0 และต่อมาคุณสามารถใช้-MethodISOWeek.GetWeekOfDate

โปรดทราบว่าปีในรูปแบบตัวเลขปี + สัปดาห์อาจแตกต่างจากปี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 Ha Lee

@Wai Ha Lee รหัสได้อธิบายไว้แล้ว ดูโพสต์ด้านบนจาก il_guru ฉันเปลี่ยนรหัสของเขาไปที่ PowerShell ดังนั้นคนอื่น ๆ สามารถใช้มันใน PowerShell ได้เพราะตอนนี้ยังไม่มีทางออกที่ดีใน PowerShell
Rainer

หากนั่นคือสิ่งที่คุณทำคุณควรให้เครดิตผู้แต่งดั้งเดิมในคำตอบด้วยตนเอง คำตอบที่คุณโอนย้ายจะมีความคิดเห็นที่ดีกว่าซึ่งคุณได้นำออกไปอย่างน่าเชื่อถือ นอกจากนี้นี่ไม่ใช่คำตอบสำหรับคำถามเนื่องจากคำถามไม่ได้กล่าวถึง PowerShell
Wai Ha Lee

1
ตอนนี้ฉันทำ @Wai Ha Lee คำถามถูกทำเครื่องหมายว่าตอบแล้วดังนั้นนี่จะเป็นคำตอบเดียวกับที่เขียนในภาษาอื่น ฉันชอบคนที่กำลังมองหาทางออกในภาษา Powershell (ฉันกำลังมองหาวิธีแก้ปัญหาใน Powershell แต่สิ่งที่ฉันพบคือทางออกใน C #) ความคิดยังคงเหมือนเดิมและผู้เขียนได้รับเครดิตสำหรับมัน
Rainer

2

วิธีที่ง่ายที่สุดในการกำหนดสไตล์ ISO 8601 ของสัปดาห์โดยใช้ c # และคลาส DateTime

ถามสิ่งนี้: วันพฤหัสบดีของสัปดาห์มีกี่วันกี่วัน คำตอบเท่ากับจำนวนสัปดาห์ที่ต้องการ

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;

มันทำงานได้ดีทั้งกับวัฒนธรรมของสหรัฐอเมริกาและรัสเซีย ISO 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);
}

nullable:

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 ฉันเดาว่าคุณคาดคะเนได้ว่าตั้งแต่ 6 วันของสัปดาห์ในปี 2013 สัปดาห์นี้ควรถูกทำเครื่องหมายเป็นสัปดาห์แรกของปี 2013

ไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องหรือไม่ สัปดาห์นั้นเริ่มต้นในปี 2012 (ในวันจันทร์ที่ 31 ธันวาคม) ดังนั้นจึงควรถูกทำเครื่องหมายเป็นสัปดาห์สุดท้ายของปี 2012 ดังนั้นจึงควรเป็นวันที่ 53 ของปี 2012 สัปดาห์แรกของปี 2013 ควรเริ่มในวันจันทร์ที่ 7

ตอนนี้คุณสามารถจัดการกับกรณีเฉพาะของสัปดาห์ขอบ (สัปดาห์แรกและสัปดาห์สุดท้ายของปี) โดยใช้ข้อมูลวันของสัปดาห์ ทุกอย่างขึ้นอยู่กับตรรกะของคุณ


โอเคฉันเห็นจุดของคุณแล้ว สิ่งนี้คือเมื่อฉันใช้ 2013/01/07 ในวิธีการของฉันมันบอกว่าสัปดาห์ที่ 2 ดังนั้น 2012/12/31 คือสัปดาห์ที่ 53 และ 2013/01/07 คือสัปดาห์ที่ 2 คุณอาจคิดว่าไม่มีสัปดาห์ 1 ในปี 2013 แต่เมื่อฉันลอง 2013/01/01 จะมีการแจ้งว่าสัปดาห์ที่ 1
Amberlamps

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.