如何计算/查找给定日期的周号? [英] How can I calculate/find the week-number of a given date?

查看:147
本文介绍了如何计算/查找给定日期的周号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何计算/查找给定日期的周数?

解决方案

  var currentCulture = CultureInfo.CurrentCulture; 
var weekNo = currentCulture.Calendar.GetWeekOfYear(
new DateTime(2013,12,31),
currentCulture.DateTimeFormat.CalendarWeekRule,
currentCulture.DateTimeFormat.FirstDayOfWeek);

请注意,这是 ISO 8601 兼容。在瑞典,我们使用ISO 8601 号码,但即使文化设置为sv-SE, CalendarWeekRule FirstFourDayWeek FirstDayOfWeek 是星期一,上述代码中, weekNo 变量将设置为 53 ,而不是正确的 1 / p>

我只使用瑞典语设置,但我确信使用ISO 8601周数的所有国家(奥地利,德国,瑞士等)都将受到此影响问题。



Peter van Ooijen Shawn Steele 对此问题有不同的解决方案。



这里一个紧凑的解决方案

  private static int WeekOfYearISO8601(DateTime date)
{
var day =(int) CultureInfo.CurrentCulture.Calendar.GetDayOfWeek(date);
return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date.AddDays(4 - (day == 0?7:day)),CalendarWeekRule.FirstFourDayWeek,DayOfWeek.Monday);
}

已测试以下日期

  var datesAndISO8601Weeks = new Dictionary< DateTime,int> 
{
{new DateTime(2000,12,31),52},
{new DateTime(2001,1,1),1},
{new DateTime ,1,1),53},
{new DateTime(2007,12,31),1},
{new DateTime(2008,12,29),1},
{ new DateTime(2010,1,3),53},
{new DateTime(2011,12,31),52},
{new DateTime(2012,1,1),52},
{new DateTime(2013,1,2),1},
{new DateTime(2013,12,31),1},
};

foreach(var dateWeek in datesAndISO8601Weeks)
{
Debug.Assert(WeekOfYearISO8601(dateWeek.Key)== dateWeek.Value,dateWeek.Key.ToShortDateString()+should是周号+ dateWeek.Value +,但是是+ WeekOfYearISO8601(dateWeek.Key));
}


How can I calculate/find the week-number of a given date?

解决方案

var currentCulture = CultureInfo.CurrentCulture;
var weekNo = currentCulture.Calendar.GetWeekOfYear(
                new DateTime(2013, 12, 31),
                currentCulture.DateTimeFormat.CalendarWeekRule,
                currentCulture.DateTimeFormat.FirstDayOfWeek);

Be aware that this is not ISO 8601 compatible. In Sweden we use ISO 8601 week numbers but even though the culture is set to "sv-SE", CalendarWeekRule is FirstFourDayWeek, and FirstDayOfWeek is Monday the weekNo variable will be set to 53 instead of the correct 1 in the above code.

I have only tried this with Swedish settings but I'm pretty sure that all countries (Austria, Germany, Switzerland and more) using ISO 8601 week numbers will be affected by this problem.

Peter van Ooijen and Shawn Steele has different solutions to this problem.

Here's a compact solution

private static int WeekOfYearISO8601(DateTime date)
{
    var day = (int)CultureInfo.CurrentCulture.Calendar.GetDayOfWeek(date);
    return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date.AddDays(4 - (day == 0 ? 7 : day)), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

It's been tested for the following dates

var datesAndISO8601Weeks = new Dictionary<DateTime, int>
                        {
                            {new DateTime(2000, 12, 31), 52},
                            {new DateTime(2001, 1, 1), 1},
                            {new DateTime(2005, 1, 1), 53},
                            {new DateTime(2007, 12, 31), 1},
                            {new DateTime(2008, 12, 29), 1},
                            {new DateTime(2010, 1, 3), 53},
                            {new DateTime(2011, 12, 31), 52},
                            {new DateTime(2012, 1, 1), 52},
                            {new DateTime(2013, 1, 2), 1},
                            {new DateTime(2013, 12, 31), 1},
                        };

foreach (var dateWeek in datesAndISO8601Weeks)
{
    Debug.Assert(WeekOfYearISO8601(dateWeek.Key) == dateWeek.Value, dateWeek.Key.ToShortDateString() + " should be week number " + dateWeek.Value + " but was " + WeekOfYearISO8601(dateWeek.Key));
}

这篇关于如何计算/查找给定日期的周号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆