Różnica DateTime pomiędzy Windowsem i Dockerem

Różnica DateTime pomiędzy Windowsem i Dockerem
BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 188
1

Mam serwis, który po SOAPie zwraca mi czas w formacie 2025-07-04T10:39:25+02:00 (ISO 8601 co oznacza, że zdarzenie miało miejsce o 10:39 czasu lokalnego i taki czas potrzebuję wyświetlić). Czas przypisuję do DateTime, a nastepnie podczas wyświetlania formatuję przez

Kopiuj
billingRecord.StartDate.ToLocalTime().ToString()

Jeżeli odpalę aplikację na swoim komputerze z Windowsem to dostaję wynik 10:39, ale jeżeli przeniosę ta aplikację na Linuxa i odpalę w kontenerze dockerowym to pokazuje się 8:39 (strefę czasowa i czas ustawione są poprawnie przez zamonotowanie - /etc/timezone:/etc/timezone:ro). Gdzie szukać powodu takiego przesunięcia?

SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1018
0

Jaką masz strefę czasową na linuxie?

Tak czy owak nie podoba mi się twoja logika. Wiesz na jaką strefę czasową chcesz przekonwertować dany czas, bo jest ona zawarta w stringu. ToLocalTime wybiera strefę czasową z twojego komputera, co wprowadza chaos. Spróbuj użyć po prostu ToString("HH:mm");

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 188
0
slsy napisał(a):

Jaką masz strefę czasową na linuxie?

Tak czy owak nie podoba mi się twoja logika. Wiesz na jaką strefę czasową chcesz przekonwertować dany czas, bo jest ona zawarta w stringu. ToLocalTime wybiera strefę czasową z twojego komputera, co wprowadza chaos. Spróbuj użyć po prostu ToString("HH:mm");

Ogarnąłem. Okazało się, że /etc/timezone strefa czasowa w kontenerze to było UTC i trzeba było ustawić to przez zmianną środowiskową:

Kopiuj
    environment:
      TZ: "Europe/Warsaw"
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
2

Przede wszystkim nie używaj DateTime, tylko DateTimeOffset. Poza tym ta 10:39, to jak zauważyłeś jest czas LOKALNY. Czas faktyczny (UTC 0) to 08:39. Samo DateTime nie przechowuje strefy czasowej. Więc ta informacja jest dostarczana w inny sposób. Natomiast DateTimeOffset już tak. Co więcej, DateTimeOffset jest zalecany do użycia przez Microsoft zamiast DateTime.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1
baroo napisał(a):

Ogarnąłem. Okazało się, że /etc/timezone strefa czasowa w kontenerze to było UTC i trzeba było ustawić to przez zmianną środowiskową:

Kopiuj
    environment:
      TZ: "Europe/Warsaw"

a czemu akurat Warszawa? Formatowanie dat na czytelny format w ogóle nie powinno być po stronie serwera, serwer powinien zwracać czas zawsze w UTC a klient może sobie to konwertować na czas lokalny jeśli chce. Inaczej jest dużo nieścisłości gdy aplikację używa się za granicą. Jeszcze parę lat temu tak było tu na 4programmers, teraz już jest lepiej

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.