代码之家  ›  专栏  ›  技术社区  ›  chester89

如何在NodaTime中获得“年初/月初”?

  •  3
  • chester89  · 技术社区  · 9 年前

    我知道有 DateTimeZone.AtStartOfDay 方法,但是否有类似的方法来获得年/月的开始?我知道最简单的方法是将它们硬编码为“X的第一天和30秒”(我这样做了 LocalDateTime start = LocalDateTime.FromDateTime(new DateTime(2014, 1, 1, 0, 0, 1, DateTimeKind.Utc)); )但我认为这远非最佳实践

    2 回复  |  直到 9 年前
        1
  •  5
  •   Jon Skeet    9 年前

    你当然不需要经过 DateTime -但要在特定时区开始一年,我只需要使用:

    var startOfYear = zone.AtStartOfDay(new LocalDate(year, 1, 1));
    

    注意,这对于获取 期间 介于 ZonedDateTime 以及年初。对于 时期 (例如5个月、2天、3小时) LocalDateTime ,这不会考虑时区。(面对时区,周期运算变得很奇怪……)

    要获得 本地日期时间 您可以使用:

    var startOfYear = new LocalDate(year, 1, 1).AtMidnight();
    

    ……尽管不能保证该日期/时间发生在任何特定时区(或仅发生一次)。

        2
  •  5
  •   Andrey Stukalin    5 年前

    也可以使用 date adjusters 以解决问题。本月初将是:

    LocalDateTime now = new LocalDateTime(2014, 6, 27, 7, 14, 25);
    LocalDateTime startOfMonth = now.With(DateAdjusters.StartOfMonth);
    Console.WriteLine(startOfMonth); // 2014-06-01T07:14:25
    

    虽然年初没有本地调整器,但我们可以组合:

    LocalDateTime now = new LocalDateTime(2014, 6, 27, 7, 14, 25);
    LocalDateTime startOfMonth = now.With(DateAdjusters.Month(1)).With(DateAdjusters.StartOfMonth);
    Console.WriteLine(startOfMonth); // 1/1/14 7:14:25 AM