[英]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();
}
}
日期格式可以是日期的任何字符串表示形式(英語或美國)
希望這可以幫助。 不過它可能需要重構:)
但並非每個人都位於美國,或者可能必須支持多種文化。 使用此解決方案來支持文化定義的周規則和第一天規則。例如,丹麥有“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.