OffsetTime в NodaTime

Я ищу какой-то OffsetTime Поддерживаю в NodaTime, но ничего не вижу. Я получаю данные в таком формате, как "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 ответ

Решение

Обновление: теперь это будет в Noda Time 2.3.


Нет, в Noda Time нет ничего, что представляло бы это. Это довольно странное значение, так как, по крайней мере, во многих часовых поясах смещение будет меняться в течение года. Я понимаю, что иногда нам нужно работать с тем, что у нас есть.

Я бы, вероятно, оставил его как два поля: Offsetи LocalTime, Затем вы можете построить 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) - это не так, как смещение "добавлено" к нему.

Другие вопросы по тегам