Azure Websites i czas lokalny

Piszę aktualnie małą aplikację webową w ASP.NET, która będzie używana jedynie w Polsce. Postanowiłem ustawić na sztywno kulturę polską, aby wszystkie daty wskazywały na właściwą godzinę. Najprościej jest to zrobić dodając wpis globalization  w web.config, co też uczyniłem.

Po uruchomieniu aplikacji na Azure Websites zauważyłem, że datą lokalną wciąż jest UTC. Szybka poprawka na ustawianie kultury podczas uruchamiania aplikacji przez nadpisywanie CurrentCulture i CurrentUICulture w aktualnym wątku, deploy i znów nic. Co jeszcze dziwniejsze, kultura aplikacji była ustawiona na polską, ale daty lokalne dalej były pobierane z UTC. Tutaj już zacząłem trochę wątpić w swoje umiejętności, ale szybki research w Google pokazał prawdziwy powód moich problemów.

Azure Websites domyślnie zwracają godzinę UTC i nie można tego zmienić przez wyżej opisane metody. Istnieją 2 rozwiązania:

  • Wpis w ustawieniach witryny na portalu Azure WEBSITE_TIME_ZONE z wartością Central European Standard Time – link
  • Każdorazowa konwersja dat do lokalnej przez zabawy z klasą TimeZoneInfo – link

Pierwszy jest dobry, gdy chcemy ustawić na sztywno datę lokalną w całej aplikacji, drugiego będziemy używali w bardziej multikulturowej aplikacji. Użyłem więc pierwszego sposobu i mam już aktualną datę na Azure 🙂

  • Pingback: dotnetomaniak.pl()

  • Ja jestem zdania, że lepiej zawsze używać dat w UTC, a konwersję do strefy czasowej robić dopiero po stronie klienta. Po pierwsze rzadko kiedy można mieć 100% pewności, że kod będzie używany w jednym kraju, a po drugie znacznie ułatwia to np. współpracę z dwiema bazami danych, które mogą różnie na to patrzeć. 😉 Używając UTC mam pewność, że nie będę mial problemów z datami.

    • Radosław Maziarka

      Nie lubię słów ‚zawsze’ / ‚nigdy’ – jeśli piszemy aplikację którą używamy przez 1 dzień a później o niej zapominamy to po co się trudzić z takim strzelaniem z armaty do komara?

      • W imię zasad 😉 Jeśli jeden dzień to może tak, ale wydaje mi się, że czasem może być nawet prościej na serwerze trzymać UTC (brak stref czasowych, zmian na letni/zimowy), a na czas użytkownika konwersję robić na końcu

  • Andrzej

    Czy ten pierwszy sposób uwzględnia automatyczną zmianę czasu na CEST w miesiącach letnich?

    • Radosław Maziarka

      O widzisz, ciekawa kwestia. Zakładam że nie, trzeba by ręcznie zmieniać tą wartość na Azure.