Lấy số tuần chính xác của một ngày nhất định


222

Tôi đã Googled rất nhiều và tìm thấy rất nhiều giải pháp, nhưng không ai trong số họ đưa cho tôi số tuần chính xác cho 2012-12-31. Ngay cả ví dụ về MSDN ( liên kết ) cũng thất bại.

2012-12-31 là thứ Hai, do đó sẽ là Tuần 1, nhưng mọi phương pháp tôi đã thử mang lại cho tôi 53. Dưới đây là một số phương pháp mà tôi đã thử:

Từ Thư viện MDSN:

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

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

Giải pháp 2:

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

Giải pháp 3:

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

Cập nhật

Phương pháp sau đây thực sự trả về 1 khi ngày là 2012-12-31. Nói cách khác, vấn đề của tôi là các phương pháp của tôi không tuân theo tiêu chuẩn 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
Làm thế nào là tuần 1 vào cuối năm? Ý tôi là, tôi thấy nơi bạn nhận được nó. Nhưng 53 có ý nghĩa với tôi.
benjer3

1
Trong đoạn mã của tôi, tôi nhận được CultureInfo và các thứ. Tôi nghĩ rằng chương trình của tôi biết sau đó tôi đang sử dụng lịch nào. (Tại Đức, ngày 31 tháng 12 năm 2012 là vào tuần 1 năm 2013)
Amberlamp

Mã này không hoạt động hoàn toàn vì nó nên thử ngày 31 tháng 12 năm 2016 hoặc 1 tháng 1 năm 2016
cavej03

@ cavej03 31-tháng 12 năm 2016 là tuần 52 và GetIso8601WeekOfYear trả về 52 vì vậy tôi đoán nó hoạt động chính xác.
Muflix

Câu trả lời:


311

Như đã lưu ý trong trang MSDN này, có một chút khác biệt giữa đánh số tuần ISO8601 và .Net.

Bạn có thể tham khảo bài viết này trong Blog MSDN để được giải thích rõ hơn: " Định dạng Tuần lễ ISO 8601 trong Microsoft .Net "

Nói một cách đơn giản, .Net cho phép các tuần được phân chia theo năm trong khi tiêu chuẩn ISO thì không. Trong bài viết cũng có một chức năng đơn giản để có được số tuần ISO 8601 chính xác cho tuần cuối cùng của năm.

Cập nhật Phương pháp sau đây thực sự trả về 1 cho 2012-12-31đúng với ISO 8601 (ví dụ: Đức).

// 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 Nếu tôi muốn tuần bắt đầu bằng chủ nhật thì sao? Tôi có thay thế tất cả "Thứ Hai" bằng "Chủ nhật" không ??
Người dùng2012384 17/03/2016

2
@ User2012384 fyi, nếu bạn muốn tuân theo tiêu chuẩn ISO8601, FirstDayOfWeek phải luôn là thứ hai.
Starceaker

1
@il_guru Bạn thậm chí không cần "cheat" này, phải không? Theo như tôi có thể nói "GetWeekOfYear (thời gian, LịchWeekRule.FirstFourDayWeek, DayOfWeek.Monday);" hoạt động tốt
Starceaker

2
Nếu bạn xem liên kết thứ hai (định dạng Tuần lễ ISO 8601 trong Microsoft .Net), bạn có thể tìm thấy câu trả lời cho câu hỏi của mình trực tiếp từ Microsoft. Một ví dụ là Thứ Hai ngày 31/12/2007: với chức năng .Net, nó sẽ trả về số tuần 53 của năm 2007 trong khi đối với tiêu chuẩn ISO, đó là tuần số 1 năm 2008
il_guru

3
Tôi đã xác minh thủ công điều này là chính xác trong năm 2012 đến 2018 (giả sử rằng epochconverter.com là chính xác). Tất cả chúng ta nên vui mừng trong năm nay, tuần 1 năm 2018 thực sự bắt đầu vào ngày đầu tiên của tháng một!
Aidan

32

Có thể có hơn 52 tuần trong một năm. Mỗi năm có thêm 52 tuần + 1 hoặc +2 (năm nhuận) ngày thêm. Họ làm cho một tuần thứ 53.

  • 52 tuần * 7 ngày = 364 ngày.

Vì vậy, mỗi năm bạn có ít nhất một ngày thêm. Hai cho năm nhuận. Là những ngày thêm được tính là tuần riêng biệt của họ?

Có bao nhiêu tuần thực sự phụ thuộc vào ngày bắt đầu trong tuần của bạn. Hãy xem xét điều này cho năm 2012.

  • Hoa Kỳ (Chủ nhật -> Thứ bảy): 52 tuần + một tuần 2 ngày ngắn cho 2012-12-30 & 2012-12-31. Điều này dẫn đến tổng cộng 53 tuần. Hai ngày cuối năm nay (Chủ nhật + Thứ Hai) tạo nên một tuần ngắn ngủi của riêng họ.

Kiểm tra cài đặt Văn hóa hiện tại của bạn để xem những gì nó sử dụng như ngày đầu tuần.

Như bạn thấy đó là bình thường để có được kết quả 53.

  • Châu Âu (Thứ Hai -> Chủ Nhật): 2 tháng 1 (2012-1-2) là ngày thứ hai đầu tiên, vì vậy đây là ngày đầu tiên của tuần đầu tiên. Hỏi số tuần cho ngày 1 tháng 1 và bạn sẽ nhận lại 52 vì đây được coi là một phần của tuần 2011.

Thậm chí có thể có một tuần thứ 54. Xảy ra cứ sau 28 năm khi ngày 1 tháng 1 và ngày 31 tháng 12 được coi là tuần riêng biệt. Nó phải là một năm nhuận quá.

Chẳng hạn, năm 2000 có 54 tuần. Ngày 1 tháng 1 (sat) là ngày một tuần đầu tiên và ngày 31 tháng 12 (mặt trời) là ngày thứ hai trong tuần.

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

In ra: Năm: 2012 Tuần: 54

Thay đổi LịchWeekRule trong ví dụ trên thành FirstFullWeek hoặc FirstFourDayWeek và bạn sẽ quay lại 53. Hãy giữ ngày bắt đầu vào thứ Hai kể từ khi chúng tôi giao dịch với Đức.

Vì vậy, tuần 53 bắt đầu vào thứ hai 2012-12-31, kéo dài một ngày và sau đó dừng lại.

53 là câu trả lời đúng. Thay đổi Văn hóa thành Đức nếu muốn thử.

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

Tôi biết rằng có thể có 53 tuần. Nhưng khi bạn có chủ nhật (30/12) và thứ hai (31/12), bạn không tính ngày thu (01/01) cũng là một phần của tuần thứ 53 ở Mỹ?
Amberlamp

Tôi chưa bao giờ thấy một tuần thứ 54!
Amberlamp

Một số gói phần mềm tài chính có chúng.
Barshe Geers

Được rồi, tôi phát hiện ra rằng nó có thể có trong lịch của Hoa Kỳ, nhưng nó sẽ không xảy ra trong lịch Đức.
Amberlamp

1
+1 cho những suy nghĩ sâu sắc của bạn về vấn đề này, nhưng đoạn mã trong mục blog được cung cấp trong một câu trả lời khác thực sự đã giải quyết vấn đề của tôi.
Amberlamp

22

Đây là cách:

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

Quan trọng nhất là CalendarWeekRuletham số.

Xem tại đây: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalTHERWeekRule);k(TargetFrameworkMoniker-.NETFramework


3
"Nhiều người đã nhận thấy rằng Calendar.GetWeekOfYear () là gần giống như các tiêu chuẩn ISO 8601 tuần khi thông qua CalendarWeekRule.FirstFourDayWeek và DayOfWeek.Monday, tuy nhiên nó là một chút khác nhau chút. Cụ thể theo tiêu chuẩn ISO 8601 luôn có 7 tuần ngày." Blogs.msdn. microsoft.com/shawnste/2006/01/24/
Mạnh

1
Liên kết của bạn bằng tiếng Ý
radbyx

đối với DateTime mới (2000,12,31), nó chỉ trả về 52?
Leszek P

18

Tin tốt! Một yêu cầu kéo thêmSystem.Globalization.ISOWeek vào .NET Core vừa được hợp nhất và hiện đang được dự kiến ​​phát hành 3.0. Hy vọng rằng nó sẽ lan truyền đến các nền tảng .NET khác trong một tương lai không xa.

Loại có chữ ký sau, sẽ đáp ứng hầu hết các nhu cầu trong tuần 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);
    }
}

Bạn có thể tìm thấy mã nguồn ở đây .

CẬP NHẬT : Các API này cũng đã được đưa vào phiên bản 2.1 của .NET Standard .


Bất cứ ý tưởng khi v 3.0 sẽ được phát hành?
Jacques

"Chúng tôi đang lên kế hoạch phát hành bản xem trước đầu tiên của .NET Core 3 vào cuối năm nay và phiên bản cuối cùng vào năm 2019." (từ bài đăng trên blog lộ trình )
khellang

@khellang làm thế nào tôi có thể có được tuần thứ tự trong một tháng dựa trên datetime? Thay vì nhận được tuần 33, tôi muốn xem Tuần 2 (vì tuần 33 là tuần 2 vào tháng 8). stackoverflow.com/questions/58039103/ cường
Roxy'Pro

11

Vì dường như không có văn hóa .Net mang lại số tuần ISO-8601 chính xác, tôi hoàn toàn bỏ qua việc xác định tuần tích hợp hoàn toàn và thực hiện phép tính bằng tay, thay vì cố gắng sửa một phần đúng kết quả.

Những gì tôi đã kết thúc là phương pháp mở rộng sau đây:

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

Trước hết, ((int)date.DayOfWeek + 6) % 7)xác định số ngày trong tuần, 0 = thứ hai, 6 = chủ nhật.

date.AddDays(-((int)date.DayOfWeek + 6) % 7) xác định ngày thứ hai đánh lừa số tuần được yêu cầu.

Ba ngày sau là thứ năm mục tiêu, quyết định năm nào trong tuần.

Nếu bạn chia số ngày (không dựa trên) trong năm cho bảy (làm tròn xuống), bạn sẽ nhận được số tuần (không dựa trên) trong năm.

Trong c #, kết quả tính toán số nguyên được làm tròn xuống ngầm.


1
Đây là giải pháp tốt nhất cho đến nay nhưng tôi sẽ chỉ ra một cách làm hơi khác: DateTime dựa trên Lịch Gregorian phổ biến - tức là nó kéo dài lịch Gregorian trở lại năm 1. Ngày 1 tháng 1 năm 0001 xảy ra Thứ hai. Tickslà số gia tăng 100 nano giây kể từ ngày 1 tháng 1 năm 0001. Cho rằng có 86.400 giây trong một ngày chúng ta có thể viết:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
Adrian S

5

Trong .NET 3.0 trở lên, bạn có thể sử dụng ISOWeek.GetWeekOfDate-Method .

Lưu ý rằng năm trong định dạng số năm + tuần có thể khác với năm DateTimedo các tuần vượt qua ranh giới năm.


3

Cổng C # đến Powershell từ mã ở trên từ 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
Bạn có thể giải thích mã của bạn? Các câu trả lời chỉ có mã thường không được chấp nhận trên StackOverflow và do đó có thể bị xóa.
Wai Ha Lee

@Wai Ha Lee mã đã được giải thích. Xem bài viết ở trên từ il_guru. Tôi đã chuyển mã của anh ấy sang powershell, vì vậy những người khác có thể sử dụng nó trong powershell vì cho đến nay không có giải pháp tốt nào cho powershell.
Rainer

Nếu đó là những gì bạn đã làm, bạn nên ghi nhận tác giả ban đầu vào câu trả lời. Câu trả lời bạn chuyển có ý kiến ​​tốt hơn mà bạn có lẽ đã loại bỏ. Ngoài ra, đây không phải là câu trả lời cho câu hỏi vì câu hỏi không đề cập đến PowerShell.
Ái Hà Lee

1
Tôi đã làm bây giờ @Wai Ha Lee. Câu hỏi đã được đánh dấu là đã trả lời, vì vậy đây sẽ là cùng một giải pháp được viết bằng ngôn ngữ khác. Tôi đã ưu ái cho mọi người, những người đang tìm kiếm một giải pháp bằng ngôn ngữ Powershell (tôi đang tìm kiếm một giải pháp trong Powershell, nhưng những gì tôi tìm thấy là một giải pháp trong C #). Ý tưởng vẫn giữ nguyên và tác giả nhận được tín dụng cho nó.
Rainer

2

Cách dễ nhất để xác định kiểu số tuần theo tiêu chuẩn ISO 8601 bằng cách sử dụng c # và lớp DateTime.

Hỏi điều này: thứ năm bao nhiêu ngày trong năm là thứ năm của tuần này. Câu trả lời bằng số tuần mong muốn.

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;

Nó hoạt động tốt cho cả nền văn hóa Hoa Kỳ và Nga. ISO 8601 cũng sẽ đúng, vì tuần lễ Nga bắt đầu vào thứ Hai.


1

Đây là phiên bản mở rộng và phiên bản nullable của il_guru không thể trả lời của câu trả lời .

Sự mở rộng:

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

Không thể

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

Tập quán:

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

0

Câu hỏi là: Làm thế nào để bạn xác định nếu một tuần là vào năm 2012 hoặc 2013? Giả sử của bạn, tôi đoán, là vì 6 ngày trong tuần là vào năm 2013, tuần này nên được đánh dấu là tuần đầu tiên của năm 2013.

Không chắc chắn nếu đây là cách đúng đắn để đi. Tuần đó bắt đầu vào năm 2012 (Vào ngày thứ hai 31 tháng 12), vì vậy nó nên được đánh dấu là tuần cuối cùng của năm 2012, do đó, nên là ngày 53 năm 2012. Tuần đầu tiên của năm 2013 sẽ bắt đầu vào thứ hai.

Bây giờ, bạn có thể xử lý trường hợp cụ thể của tuần tuần (tuần đầu tiên và tuần cuối cùng của năm) bằng cách sử dụng thông tin ngày trong tuần. Tất cả phụ thuộc vào logic của bạn.


Được rồi, tôi có thể thấy quan điểm của bạn. Vấn đề là khi tôi sử dụng 2013/01/07 trong bất kỳ phương pháp nào của mình, nó nói tuần 2. Vì vậy, 2012/12/31 là tuần 53 và 2013/01/07 là tuần 2. Bạn có thể nghĩ rằng không có tuần 1 của năm 2013. Nhưng khi tôi thử 2013/01/01 thì nó báo tuần 1.
Amberlamp

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

Dựa trên câu trả lời của il_guru, tôi đã tạo phiên bản này cho nhu cầu của riêng mình cũng trả về thành phần năm.

    /// <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

Hai phương pháp này sẽ giúp ích, giả định tuần của chúng tôi bắt đầu vào thứ Hai

/// <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

Một năm có 52 tuần và 1 ngày hoặc 2 trong trường hợp một năm vòng (52 x 7 = 364). 2012-12-31 sẽ là tuần 53, một tuần chỉ có 2 ngày vì năm 2012 là một năm.


Điều này là không đúng. Ngày đầu tiên của tuần có thể rơi vào bất kỳ ngày nào trong tuần, tùy thuộc vào cách bạn đếm các tuần, năm có thể có tuần thứ 54.
krowe2

-2
public int GetWeekNumber()
{
   CultureInfo ciCurr = CultureInfo.CurrentCulture;
   int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, 
   CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
   return weekNum;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.