NodaTime如何获取"start of the year/month"?

How to get "start of the year/month" in NodaTime?

我知道有 DateTimeZone.AtStartOfDay 方法,但是是否有类似的方法来开始 year/month?我知道最简单的方法是将它们硬编码为 "first day of X and 30 seconds"(我这样做 LocalDateTime start = LocalDateTime.FromDateTime(new DateTime(2014, 1, 1, 0, 0, 1, DateTimeKind.Utc));),但我认为这远非最佳实践

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

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

请注意,这对于获取 ZonedDateTime 和年初之间的 duration 很有用。对于 period(例如 5 个月、2 天、3 小时),您只需使用 LocalDateTime,这不会考虑时区。 (面对时区,周期运算变得很奇怪......)

要获得 LocalDateTime,您只需使用:

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

...虽然不能保证 date/time 发生在任何特定时区(或只发生一次)。

也可以用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