簡體   English   中英

獲取當前周數 (C#)

[英]Get Current Week Number (C#)

我一直在查看 Microsoft 的文檔和許多堆棧溢出帖子,但似乎沒有一個回答我的問題。 我想知道在 c# 中獲取當前日期的准確周數的最簡單和最簡單的方法。 我對 c# 很陌生,所以請盡量保持簡單。 我試過使用:

int week = DateTime.Now.DayOfYear/7;
Console.WriteLine(week)

但是在星期一(當我希望它移到下周時)它會顯示為前一周。 例如:如果日期是 2020 年 12 月 21 日,則表示當前周是第 50 周,即休息 2 周。 然后在 2020 年 12 月 22 日,它會說這是第 51 周,即休息 1 周。

請提前幫助和感謝。

這可能是您正在尋找的:

DateTime dt = new DateTime(2020, 12, 21);
Calendar cal = new CultureInfo("en-US").Calendar;
int week = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
Console.WriteLine(week);

您可以更改CalendarWeekRule參數以更改一年中第一周的定義:

FirstDay表示一年中的第一周可以有任意長度。 例如,如果一年中的第一天是星期日,它將被計為一周,而下一個星期一將被計為第二周的一部分。

FirstFourDayWeek表示第一周主要在今年才算。 例如,如果一年的第一天是星期四,則將計算該周,但如果該年從星期五開始,則不計算第一周。

FirstFullWeek表示將計算的第一周將是一年中的第一個完整周。

當我在 LotusNotes 中編寫應用程序時,我也看過這個。 根據我的發現,一年中的第一周必須包含一個星期四。 如果您假設星期日是一周的最后一天,那么星期日的最低日期必須是第四天。 考慮到這一點(我對 C# 和所有錯綜復雜的東西都很陌生)我編寫了這段代碼,它將為您提供任何給定日期的周數以及今年和前一年的周數。 #

public class DateCalculations
{
    private readonly DateTime _weekDate;

    private DateTime ThisSunday => GetSundayDate(_weekDate);
    private DateTime FirstDay_ThisYear => DateTime.Parse($"01/01/{ ThisSunday.Year }");
    private DateTime FirstDay_LastYear => DateTime.Parse($"01/01/{ ThisSunday.Year - 1 }");
    private DateTime FirstDay_NextYear => DateTime.Parse($"01/01/{ ThisSunday.Year + 1 }");
    private DateTime FirstSunday_ThisYear => GetSundayDate_WeekOne(FirstDay_ThisYear);
    private DateTime FirstSunday_LastYear => GetSundayDate_WeekOne(FirstDay_LastYear);
    private DateTime FirstSunday_NextYear => GetSundayDate_WeekOne(FirstDay_NextYear);


    public DateCalculations(string weekDate)
    {
        if (DateTime.TryParse(weekDate, out _weekDate))
        {
            return;
        }
        else
        {
            throw new Exception("Incorrect date has been supplied");
        }
    }

    private bool IsDateInFirstWeek(DateTime suppliedDate)
    {
        var output = false;
        // First week must contain a Thursday, so lowest Sunday date possible is the 4th
        if (suppliedDate.Day >= 4)
        {
            output = true;
        }

        return output;
    }

    private DateTime GetSundayDate(DateTime suppliedDate)
    {
        var checkDay = suppliedDate;

        //Check if the day of the supplied date is a Sunday
        while (checkDay.DayOfWeek != DayOfWeek.Sunday)
        {
            checkDay = checkDay.AddDays(1);
        }
        return checkDay;
    }

    private DateTime GetSundayDate_WeekOne(DateTime suppliedDate)
    {
        var checkDay = GetSundayDate(suppliedDate);
        if (IsDateInFirstWeek(checkDay) == false)
        {
            checkDay = checkDay.AddDays(7);
        }

        return checkDay;
    }

    public int WeekNumber()
    {
        var output = 0;

        if (ThisSunday == FirstSunday_ThisYear)
        {
            output = 1;
        }
        else if(ThisSunday > FirstSunday_ThisYear)
        {
            TimeSpan daysBetween = ThisSunday - FirstSunday_ThisYear;
            output = (daysBetween.Days/7) + 1;
        }
        else
        {
            TimeSpan daysBetween = ThisSunday - FirstSunday_LastYear;
            output = (daysBetween.Days / 7) + 1;
        }

        return output;
    }

    public int TotalWeeksThisYear()
    {
        TimeSpan daysBetween = FirstSunday_NextYear - FirstSunday_ThisYear;

        return (daysBetween.Days / 7);
    }

    public int TotalWeeksLastYear()
    {
        TimeSpan daysBetween = FirstSunday_ThisYear - FirstSunday_LastYear;

        return (daysBetween.Days / 7);
    }
}

我的控制台用於測試

class Program
{
    static void Main()
    {
        var test = new DateCalculations("2021-01-03");

        var weekNumber = test.WeekNumber();
        var totalWeeks = test.TotalWeeksThisYear();
        var pastWeeks = test.TotalWeeksLastYear();
        
        Console.ReadLine();
    }
}

日期格式可以是日期的任何字符串表示形式(英語或美國)

希望這可以幫助。 不過它可能需要重構:)

建立在這個答案之上: @bunny4

但並非每個人都位於美國,或者可能必須支持多種文化。 使用此解決方案來支持文化定義的周規則和第一天規則。例如,丹麥有“FirstFourDayWeek”周規則和“星期一”作為一周的第一天。

//for now, take the the current executing thread's Culture
var cultureInfo = Thread.CurrentThread.CurrentCulture;

//let's pick a date
DateTime dt = new DateTime(2020, 12, 21);

DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
CalendarWeekRule weekRule = cultureInfo.DateTimeFormat.CalendarWeekRule;
Calendar cal = cultureInfo.Calendar;
int week = cal.GetWeekOfYear(dt, weekRule, firstDay);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM