Mam aplikację ze strefą czasową serwera BST (British Summer Time). Gdy Date
zostanie utworzona strefa czasowa, ponieważ strefa czasowa jest wyświetlana jako BST (lub +01:00
) kiedy Date
obiekt jest konwertowany na a Time
obiekt (in_time_zone
jest metodą szyn, ale jest używana w pytaniu tylko w celu podkreślenia problemu.):
Date.today.to_time #=> 2014-09-16 00:00:00 +0100
Date.today.to_time.in_time_zone #=> Tue, 16 Sep 2014 00:00:00 BST +01:00
Jednak, DateTime
nie przestrzega strefy czasowej:
Date.today.to_datetime #=> Tue, 16 Sep 2014 00:00:00 +0000
i zostanie to przetłumaczone na 1 w nocy przez serwer:
Date.today.to_datetime.in_time_zone #=> Tue, 16 Sep 2014 01:00:00 BST +01:00
Obecnie wykonuję następujące czynności, aby wymusić poprawną strefę czasową w obiekcie datetime:
Date.today.to_time.to_datetime #=> Tue, 16 Sep 2014 00:00:00 +0100
ale wydaje się to na tyle złe, że można umieścić w kodzie komentarz wyjaśniający, dlaczego jest napisany w ten sposób.
Dlaczego konwersja na DateTime
zachowują się inaczej niż konwersja do Time
? Czy powinien być traktowany jako błąd rubinowy, czy jest to zamierzone zachowanie?
Ten sam problem występuje w irb. Przetestowano w Ruby-1.9.3-p448, Ruby-2.1.0 i Ruby-2.1.2.
Odpowiedzi:
1 dla odpowiedzi № 1Przynajmniej wygląda to na zamierzone zachowanie, jak to zauważono tutaj i tutaj, a autor Tadayoshi Funaba ma kilkakomentuje to w dyskusji. Chociaż (nie przeczytałem i) nie do końca kieruję się logiką (podobnie jak osoba, która o to pyta, i wielu innych). Wydaje się, że Tadayoshi Funaba poczuł się sfrustrowany i (prawdopodobnie z tego powodu celowo) komentarze są w większości po japońsku, mimo że pytanie zostało napisane po angielsku.