如何获得"年/月的开始"在NodaTime?

时间:2015-08-11 07:42:06

标签: .net datetime nodatime

我知道有DateTimeZone.AtStartOfDay方法,但是有类似的方法可以获得年/月的开头吗?我知道最简单的方法是将这些硬编码到" X和30秒的第一天" (我做过LocalDateTime start = LocalDateTime.FromDateTime(new DateTime(2014, 1, 1, 0, 0, 1, DateTimeKind.Utc));),但我认为这远非最佳做法

2 个答案:

答案 0 :(得分:3)

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

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

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

要获得LocalDateTime,您可以使用:

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

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

答案 1 :(得分:1)

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