2017-06-13 26 views
5

Szukam pewnego rodzaju wsparcia OffsetTime w NodaTime, ale nie widzę nic. Otrzymuję dane w formacie "17: 13: 00 + 10: 00". Mam traktować to jako przesunięcie czasowe, stosując je do określonej daty (którą kontroluje użytkownik), aby dotrzeć do czasu lokalnego w celu wyświetlania.OffsetTime w NodaTime

Najlepszą udało mi się wymyślić to:

// 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; 

myślę, zastanawiam się, czy ja widokiem lepszy sposób to zrobić.

+0

[DateTimeZone] (http://nobiime.org/unstable/api/NodaTime.DateTimeZone.html)? –

+0

Jestem zdezorientowany przez "zastosowanie go do określonej daty (której użytkownik kontroluje)". Oznacza to, że użytkownik kontroluje datę, ale nie ma wiedzy, że zostanie zastosowane przesunięcie? Czy użytkownik jest zobowiązany do wprowadzenia daty obowiązującej w strefie czasowej, w której znajduje się komputer użytkownika? Czy użytkownik wprowadza datę obowiązującą podczas pisania przez użytkownika, czy może to być starsza data, kiedy reguły strefy czasowej mogły być inne? –

+1

Duże znaczenie ma to, czy data jest dzisiejszą datą, a program przetwarza ją natychmiast, czy jest to stara data. Aby ustalić lokalną datę starej daty, musisz znać nazwę strefy czasowej, a nie tylko przesunięcie, uwzględniającą czas letni i zmiany legislacyjne w strefach czasowych. –

Odpowiedz

3

Aktualizacja: teraz będzie w Nodzie 2.3.


Nie, nic nie reprezentuje tego w czasie Noda. Jest to dość dziwny rodzaj wartości, ponieważ w co najmniej wielu strefach czasowych przesunięcie będzie się zmieniać w ciągu roku. Rozumiem, że czasami musimy pracować z tym, co mamy.

Prawdopodobnie zachowam to jako dwa pola: Offset i LocalTime. Następnie można zbudować model OffsetDateTime po uzyskaniu LocalDate. Możesz uzyskać te dwa poprzez OffsetDateTime, tak jak już to robisz, ale sugeruję podzielenie go na dwie wartości tak szybko, jak to możliwe, aby uniknąć jakiejkolwiek wskazówki, że jest tam przydatna data.

Jeśli chcesz zachować istniejące struktury kodu, można przynajmniej sprawiają, że znacznie prostsze:

// 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; 

Zauważ, że localTime tutaj zawsze będzie równoznaczne desiredLocalDate.At(parsed.TimeOfDay) - to nie jest tak, offset jest „dodany” do tego.

+0

Dzięki Jon. W rzeczywistości, ten ostatni punkt, o którym mówisz, że offset nie jest brany pod uwagę przy żądaniu 'LocalDateTime' znajduje się na mojej liście jako coś, do czego należy dążyć. Jak obliczyć poprawny czas lokalny dla danego 'OffsetDateTime'? Z przyjemnością otworzymy kolejną Q, jeśli to konieczne. –

+0

@KentBoogaart: 'OffsetDateTime' już reprezentuje' LocalDateTime' przy określonym przesunięciu - "17: 13: 00 + 10: 00" oznacza "Lokalny czas 17:13, jest 07:13 UTC". Możesz użyć 'OffsetDateTime.WithOffset' do zmiany offsetu zachowując ten sam' LocalDateTime', np. aby uzyskać "czas lokalny w UTC", możesz użyć 'WithOffset (Offset.Zero) .LocalDateTime'. –

+0

Ah, tak. Bardzo źle to sformułowałem i pomyliłem się w tym procesie. Serwer daje mi np. "2017-01-01T13: 30: 00 + 10: 30" i muszę dowiedzieć się, co to jest w czasie lokalnym, co może być inną offsetową. Używając twojej sugestii, wykonam 'WithOffset', przekazując przesunięcie UTC zegara systemowego. Dzięki Jon! –