我正在NodaTime中寻找某种对OffsetTime的支持,但是什么也没看到。我正在以“17:13:00 + 10:00”之类的格式接收数据。我将其视为时间偏移,将其应用于给定日期(用户可以控制)以到达本地时间以进行显示。

我能想到的最好的方法是:

// the date for this OffsetDateTime will be 1/1/2000
var parsed = OffsetDateTimePattern.CreateWithInvariantCulture("HH:mm:sso<G>").Parse(input).Value;

var desiredLocalDate = new LocalDate(2017, 06, 13);
var adjusted = new OffsetDateTime(
    new LocalDateTime(desiredLocalDate.Year, desiredLocalDate.Month, desiredLocalDate.Day, parsed.Hour, parsed.Minute, parsed.Second, parsed.Millisecond),
    parsed.Offset);
var localTime = adjusted.LocalDateTime;

我想我想知道我是否正在忽略一种更好的方法来做到这一点。

最佳答案

更新:现在是Noda Time 2.3。

不,在Noda Time中没有任何代表这一点的东西。这是一种很奇怪的值(value),因为至少在许多时区,偏移量会随着一年的变化而变化。我了解有时我们需要使用已有的知识。

我可能会将其保留为两个字段:OffsetLocalTime。一旦有了OffsetDateTime,您就可以构建一个LocalDate。您可以像现在一样通过OffsetDateTime获得这两个值,但是我建议您尽快将其拆分为两个值,以免出现任何有用的提示。

如果要保留现有的代码结构,则至少可以使其更简单:

// The date for this OffsetDateTime will be 1/1/2000
// Note: the pattern can be created once and reused; it's thread-safe.
var parsed = OffsetDateTimePattern.CreateWithInvariantCulture("HH:mm:sso<G>")
    .Parse(input).Value;
var desiredLocalDate = new LocalDate(2017, 06, 13);
var adjusted = desiredLocalDate.At(parsed.TimeOfDay).WithOffset(parsed.Offset);
var localTime = adjusted.LocalDateTime;

请注意,此处的localTime始终与desiredLocalDate.At(parsed.TimeOfDay)等效-并不是将偏移量“添加”到了它。

10-04 13:47