我正在包装NodaTime,以便在我们的软件中使用,为了证明未来的可靠性,我想我应该根据Bcl DateTimeFormat设置iWeekyArrule,如下所示:
var culture = CultureInfo.CurrentCulture;
var weekRule = WeekYearRules.FromCalendarWeekRule(
culture.DateTimeFormat.CalendarWeekRule,
culture.DateTimeFormat.FirstDayOfWeek);
在挪威,我们遵循以下设置:
CalendarWeekRule.FirstFourDayWeek
DayOfWeek.Monday
然而,令我惊讶的是,当我查看以下两个日期的周数时,
kalender.no
不同意:
2018-12-31: week 53 of 2018 (kalender.no says week 1 [implied: of 2019])
2019-01-01: week 1 of 2019 (kalender.no agrees here)
但是,如果我使用WeekyarRules。Iso,他们都返回“2019年第一周”,这是正确的。
我有一大堆问题,但让我们关注最直接的一个:
我如何编写代码来“证明未来”图书馆的这一部分,这样当我们开始将软件推广到世界上更多的地方时,它就能根据当地文化准确地计算周数?
或者这是不可能的,因为文化信息不包含这一点?
这里有一个
LINQPad
演示NodaTime行为的示例(很抱歉没有首先包含[mcve]:
void Main()
{
"-------------- ISO --------------".Dump();
Test(WeekYearRules.Iso);
"-------------- BCL --------------".Dump();
Test(WeekYearRules.FromCalendarWeekRule(CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday));
}
public static void Test(IWeekYearRule rule)
{
var date = new LocalDate(2018, 12, 31);
$"{date}, {rule.GetWeekOfWeekYear(date)} in {rule.GetWeekYear(date)}".Dump();
date = new LocalDate(2019, 1, 1);
$"{date}, {rule.GetWeekOfWeekYear(date)} in {rule.GetWeekYear(date)}".Dump();
}
输出:
-------------- ISO --------------
mandag 31. desember 2018, 1 in 2019
tirsdag 1. januar 2019, 1 in 2019
-------------- BCL --------------
mandag 31. desember 2018, 53 in 2018
tirsdag 1. januar 2019, 1 in 2019
(需要明确的是,ISO输出是挪威的正确输出)
这是NodaTime 2.4.4,Windows 10。NET 4.7.2。
下面是一个不使用NodaTime的LINQPad示例:
void Main()
{
var culture = CultureInfo.GetCultureInfo("nb-NO");
var calendarWeekRule = culture.DateTimeFormat.CalendarWeekRule.Dump();
var firstDayOfWeek = culture.DateTimeFormat.FirstDayOfWeek.Dump();
var date = new DateTime(2018, 12, 31);
$"{date.DayOfWeek} {date}, week {culture.Calendar.GetWeekOfYear(date, calendarWeekRule, firstDayOfWeek)}".Dump();
date = new DateTime(2019, 1, 1);
$"{date.DayOfWeek} {date}, week {culture.Calendar.GetWeekOfYear(date, calendarWeekRule, firstDayOfWeek)}".Dump();
}
输出:
FirstFourDayWeek
Monday
Monday 31.12.2018 00.00.00, week 53
Tuesday 01.01.2019 00.00.00, week 1
那里的星期一与2019年的第一周在同一周,在挪威被算作2019年的第一周,所以两个日期中的第一个应该是:
Monday 31.12.2018 00.00.00, week 1