我有一个相当奇怪的问题。我住在丹麦,2013年的第一周(第一周)从2012年12月31日开始,持续7天--就像往常一样:)
根据.NET的说法,12月30日是52周,31号是53周,1月1日是1周。
第53周仅持续一天,第1周持续6天。显然,这肯定是错误的(一周由不到7天组成),在丹麦上下文中肯定是错误的。其中12月31日是第1周,而不是第53周。
下面的代码说明了这个问题(CurrentCulture是"da-DK")
static void Main(string[] args)
{
//Here I get Monday
DayOfWeek firstDayOfWeek = DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek;
//Here I get FirstFourDayWeek
CalendarWeekRule weekRule = DateTimeFormatInfo.CurrentInfo.CalendarWeekRule;
DateTime date = new DateTime(2012,12,30);
for (int i = 0; i <= 10; i++)
{
DateTime currentDate = date.AddDays(i);
Console.WriteLine("Date: {0} WeekNumber: {1}",
currentDate.ToShortDateString(),
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(currentDate, weekRule, firstDayOfWeek));
}
Console.ReadLine();
}
是我做错了什么呢,还是这是.NET中的一个bug?如果是后者-你对正确计算周数有什么建议吗?
发布于 2012-08-30 21:36:39
谢谢你所有的答案。我还进行了更多的搜索,最终创建了两个C#方法来实现我想要的:
首先,在http://blogs.msdn.com/b/shawnste/archive/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net.aspx的一条评论中找到了一个简洁的评论:
Jon Senchyna还指出:
public static int WeekNumber(this DateTime date)
{
Calendar cal = CultureInfo.InvariantCulture.Calendar;
DayOfWeek day = cal.GetDayOfWeek(date);
date = date.AddDays(4 - ((int)day == 0 ? 7 : (int)day));
return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
还有一位是:http://www.tondering.dk/claus/cal/week.php#calcweekno
public static int WeekNumber2(this DateTime date)
{
int a;
int b;
int c;
int s;
int e;
int f;
if (date.Month <= 2)
{
a = date.Year - 1;
b = a / 4 - a / 100 + a / 400;
c = (a - 1) / 4 - (a - 1) / 100 + (a - 1) / 400;
s = b - c;
e = 0;
f = date.Day - 1 + 31 * (date.Month - 1);
}
else
{
a = date.Year;
b = a / 4 - a / 100 + a / 400;
c = (a - 1) / 4 - (a - 1) / 100 + (a - 1) / 400;
s = b - c;
e = s + 1;
f = date.Day + ((153 * (date.Month - 3) + 2) / 5) + 58 + s;
}
int g = (a + b) % 7;
int d = (f + g - e) % 7;
int n = f + 3 - d;
if (n < 0)
return 53 - ((g - s) / 5);
if (n > (364 + s))
return 1;
return n / 7 + 1;
}
都给了我想要的。
我还写了一个小的单元测试,证明它们在日历的前3000年返回相同的周数字。
[TestMethod]
public void WeekNumbers_CorrectFor_3000Years()
{
var weekNumbersMethod1 = WeekNumbers3000Years(DateManipulation.WeekNumber).ToList();
var weekNumbersMethod2 = WeekNumbers3000Years(DateManipulation.WeekNumber2).ToList();
CollectionAssert.AreEqual(weekNumbersMethod1, weekNumbersMethod2);
}
private IEnumerable<int> WeekNumbers3000Years(Func<DateTime, int> weekNumberCalculator)
{
var startDate = new DateTime(1,1,1);
var endDate = new DateTime(3000, 12, 31);
for(DateTime date = startDate; date < endDate; date = date.AddDays(1))
yield return weekNumberCalculator(date);
}
发布于 2016-03-22 21:08:36
您可以使用以下代码来计算给定日期的周数:
public static int GetWeekNumber(DateTime date)
{
var firstDayOfYear = new DateTime(date.Year, 1, 1);
var lastDayOfYear = new DateTime(date.Year, 12, 31);
var lastDayOfPreviousYear = new DateTime(date.Year - 1, 12, 31);
var weekDayOfFirstDayOfYear = (int)firstDayOfYear.DayOfWeek + 1;
var weekDayOfLastDayOfYear = (int)lastDayOfYear.DayOfWeek + 1;
var days = (date - firstDayOfYear).Days;
if (days <= 7 - weekDayOfFirstDayOfYear) // My day fall in 1'st week of the year
{
if (weekDayOfFirstDayOfYear > 5)
return GetWeekNumber(lastDayOfPreviousYear);
return 1;
}
else // My day fall not on 1'st week of the year
{
// Number of weeks that pass from 1'st Sunday of 2'nd week of the year
var weekNo = ((days - (8 - weekDayOfFirstDayOfYear)) / 7) + 1;
if (weekDayOfFirstDayOfYear < 6) // if Year start at Sun...Thursday the first week is added.
weekNo++;
// Check if Last week of the year belong to next year
if (weekDayOfLastDayOfYear < 5) // if the year end in Sunday to Wednesday then it might belong to the 1'st week of the next year
{
if ((lastDayOfYear - date).Days < weekDayOfLastDayOfYear)
{
return 1;
}
}
return weekNo;
}
}
https://stackoverflow.com/questions/12196714
复制相似问题