野田时代

Era in NodaTime

我注意到与日期相关的类型——LocalDateLocalDateTimeOffsetDateTime, ZonedDateTime -- 只有 LocalDate 接受纪元作为构造参数:

public LocalDate(int year, int month, int day);
public LocalDate(Era era, int yearOfEra, int month, int day, [NotNullAttribute] CalendarSystem calendar);

提供基于纪元的构造函数只是为了方便吗?如果是这样,为什么它不扩展到将构造函数限制为非时代值的其他类型?例如:

public LocalDateTime(int year, int month, int day, int hour, int minute);

所有类型都有一个不可变的 Era 参数。据我所知,在其他类型中影响 Era 的唯一方法是在构造期间使用的日历。

有人能解释一下这个设计选择吗?

基本上是监督和避免大量超载的结合。在 LocalDateTime.

中有这样一个构造函数肯定是合乎逻辑的 sense

ZonedDateTimeOffsetDateTime 没有接受单个组件的构造函数 - 您应该从其他类型之一创建它们。所以只有 LocalDateTime 需要添加任何内容。

然而,接下来的问题是要添加哪些重载。 LocalDateTime 中已经有 8 个构造函数 - 四种精度变体(精确到分、秒、毫秒和毫秒内的刻度)和每个接受 CalendarSystem 或假设 ISO 的两个重载。我不想将这个构造函数的数量加倍到 16(而且在 2.0 中你不能直接用构造函数构造一个纳秒精度的值已经很奇怪了......)

纪元的使用非常不寻常,因此与其让每个人都不得不为处理大量构造函数付出复杂性代价,不如分别构造一个 LocalDate 和一个 LocalTime 更简单:

var ldt = new LocalDate(Era.Xyz, yearOfEra, month, day, calendar) +
          new LocalTime(....);

这很简单而且仍然有效,没有过载爆炸的头痛。