2015-06-19 11 views
15

Accordingtomultiplepostings, Microsoft umożliwił korzystanie z ustawienia aplikacji - WEBSITE_TIME_ZONE - w celu kontrolowania strefy czasowej serwera WWW.Zmiana strefy czasowej w internetowych aplikacjach Azure Nie działa w przypadku funkcji DateTimeOffset.Now?

Aby to wypróbować, ustawiam tę wartość na "Wschodni czas standardowy", który jest moją lokalną strefą czasową.

Na stronie ASP.NET MVC Razor I dodaje następujący kod:

DateTime.Now: @DateTime.Now 
DateTimeOffset.Now: @DateTimeOffset.Now 
DateTime.UtcNow: @DateTimeOffset.UtcNow 

kiedy wpadłem to ostatnia noc w 5:10:07 pm Eastern Standard Time, dało następujący wynik:

DateTime.Now: 6/18/2015 5:10:07 PM 
DateTimeOffset.Now: 6/18/2015 5:10:07 PM +00:00 
DateTime.UtcNow: 6/18/2015 9:10:07 PM 

Jak widać, ustawienie poprawnie pozwoliło DateTime.Now na zwrócenie prawidłowej wartości w mojej strefie czasowej, a nie na UTC, tak jak zwykle na stronach Azure Websites/Web Apps. DateTime.UtcNow zawsze zwracał poprawną wartość z oczywistych powodów.

Jednak DateTimeOffset.Now zwraca lokalny czas, ale z przesunięciem +00:00 - prawie tak, jakby zegar został zmieniony zamiast strefy czasowej. Dzieje się tak, mimo że documentation mówi (Kopalnia nacisk):

Pobiera obiekt datetimeoffset, który jest ustawiony na bieżącą datę i czas na bieżącym komputerze, ze skorygowanym ustawiony na czas lokalny offset od Coordinated Universal Time (UTC).

Więc co się dzieje, że skutki ustawień WEBSITE_TIME_ZONEDateTime.Now ale to nie wpływa DateTimeOffset.Now? I czy jest jakiś sposób, żeby to obejść?

Nie chcę zmieniać strefy czasowej na serwerze, jako punktu wyjaśniającego. Pracujemy nad odpowiednim niezależnym rozwiązaniem dla strefy czasowej. Ale wciąż jestem ciekawy, dlaczego tak się dzieje.

+2

Naprawdę trzeba zmienić strefę czasową serwera? Starałbym się tak bardzo, jak to możliwe, unikać tego wymogu. Zgadzam się, to dziwne zachowanie DateTimeOffset.Now, pamiętajcie ... –

+0

Zastanawiam się, wyjaśniając, że w OP. Wolałbym nie zmieniać strefy czasowej serwera. Właśnie podczas eksploracji opcji, przebiegłem ten i nie rozumiałem jak to działało (albo dlaczego to nie działa tak, jak myślałem). Pomyślałem więc, że spróbuję uzyskać wyjaśnienie. – Tim

+1

Ma sens - i jestem za eksperymentowaniem z rzeczami, których naprawdę nie chciałbyś robić :) –

Odpowiedz

0

Występuję w tym samym problemie. Na nieszczęście dla mnie odziedziczyłem wiele starszych kodów napisanych specjalnie dla Eastern Standard Time, więc aktualizacja ich do pracy z UTC zasadniczo nie jest opcją.

Po wykopaniu kodu CLR wygląda na to, że lokalna strefa czasowa jest porównywana z rejestrem systemu. Nie widać, w jaki sposób mogą one poprawnie obsługiwać tę funkcję bez zmiany kodu CLR, ponieważ aplikacje internetowe Azure działają na współdzielonych maszynach wirtualnych.

Na razie będę się do tego zbliżał z następującym hackowaniem przy uruchamianiu witryny, aby oszukać .Net w myśleniu, że jest we wschodnim czasie standardowym. To nie jest świetne rozwiązanie i najprawdopodobniej się zepsuje, jeśli zmienią implementację klasy TimeZoneInfo, ale mam nadzieję, że powodem zmiany tej opcji będzie rozwiązanie tego problemu.

// rewrite local timezone 
var tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

var fInfo = typeof(TimeZoneInfo).GetField("s_cachedData", BindingFlags.Static|BindingFlags.NonPublic); 
var cachedData = fInfo.GetValue(null); 

fInfo = cachedData.GetType().GetField("m_localTimeZone", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
fInfo.SetValue(cachedData, tz); 
5

Cóż, dla mnie działa teraz.Jeśli to nie działa upewnij się, że ustawiona wartość prawy

  1. Otwórz regedit
  2. wyszukiwania dla „strefy czasowej”
  3. Sprawdź jak strefa jest napisane. Na przykład moja strefa to "Wschodnia EST (+2)", aw rejestrze jej nazwa to "E. Europa Standard Time"

Dodałem więc do ustawień aplikacji w aplikacji Azure "WEBSITE_TIME_ZONE: E. Europe Standard Time" i to działa.

+0

Ta odpowiedź zadziałała, ale wyszukiwanie regedit jest dość głupie (a wartość, jakiej szukałem, nie była nawet w moim rejestrze). Wartości należy opublikować gdzieś, zamiast tego robić. W każdym razie, FYI dla tych w Japonii, wartość to "Tokyo Standard Time". Tutaj jest świetny wpis na blogu (tylko Jp) http://blog.shibayan.jp/entry/20150909/1441725327 – starmandeluxe

+0

@starmandeluxe Najlepiej zacząć używać UTC, teraz skończyło się, że muszę przeprowadzić migrację do UTC: (będzie to wymagać odrobiny wysiłku) –

+0

dzięki za sugestię, niestety jestem w tej samej łodzi, co ty, pracujesz nad starszym zasobem kodu, który nie może zostać natychmiast zmigrowany, ponieważ wydania muszą być kontynuowane. w tym momencie potrzebuję go do działania. – starmandeluxe

2

Dla tych, którzy natkną się na to pytanie. Zostało to naprawione od dłuższego czasu.

Powiązane problemy