NodaTime中的偏移时间

时间:2017-06-13 07:06:16

标签: c# .net nodatime

我正在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;

我想我想知道我是否忽视了更好的方法。

1 个答案:

答案 0 :(得分:3)

更新:现在将在Noda Time 2.3。

不,在Noda Time中没有任何代表这一点的东西。这是一种非常奇怪的价值,因为至少在很多时区,偏移量会在一年内发生变化。我知道有时候我们需要使用我们所拥有的东西。

我可能会将其保留为两个字段: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) - 它不像偏移是&#34;添加&#34;它。