代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

如何手动正确配置NodeTime iWeekyArRule?

  •  3
  • Lasse V. Karlsen  · 技术社区  · 6 年前

    我正在包装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
    
    0 回复  |  直到 6 年前