如何在NodaTime中获得“年/月的开始”?

che*_*r89 3 .net datetime nodatime

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

And*_*lin 6

也可以使用日期调整器来解决该问题。对于月初来说,它将是:

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

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

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

Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

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

var startOfYear = zone.AtStartOfDay(new LocalDate(year, 1, 1));
Run Code Online (Sandbox Code Playgroud)

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

要获得一个LocalDateTime你可以使用:

var startOfYear = new LocalDate(year, 1, 1).AtMidnight();
Run Code Online (Sandbox Code Playgroud)

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