1 odpowiedź

Najlepsza odpowiedź

Twoje sugerowane podejście jest wadliwe, że przesunięcie z przeglądarki klienta ma zastosowanie tylko do daty i godziny i czasu . W rzeczywistości przesunięcia strefy czasowej zmieniają się w czasie w określonej strefie czasowej. Nie można po prostu wziąć pojedynki przesunięcia z jednego punktu czasu i spodziewać się użycia go do konwersji innych dat i czasów do tej samej strefy czasowej. Zamiast tego musisz użyć ciąg, który identyfikuje strefę czasową , a nie przesunięcie z tej strefy.

Jako przykład rozważyć wschodnią strefę czasową w Stanach Zjednoczonych. Na część roku wykorzystuje UTC-5 i nazywamy go czasem wschodnim standardowym (EST). W innej innej części roku wykorzystuje UTC-4, a my nazywamy It Wschodni Daylight Time (EDT). Ta strefa czasowa jest identyfikowana przez identyfikator strefy czasowej Iana "America/New_York", lub identyfikator strefy czasu systemu Windows "Eastern Standard Time" (który obejmuje całą strefę, zarówno EST, jak i EDT, pomimo jego brzmienia).

Więc przerwij ten problem na kilka kroków:

  1. W JavaScript, zidentyfikuj strefę czasową IANA Użytkownicy (America/New_York):

    • Jeśli kierujesz nowoczesnymi przeglądarkami internetowymi, możesz zadzwonić do tej funkcji:

       {x0}} 
    • Jeśli chcesz obsługiwać starsze przeglądarki internetowe, możesz użyć JstimeZonedetect lub { {X1}} z Moment-streoSzone.

  2. Wyślij ten łańcuch do serwera WWW poprzez dowolne mechinsm lubisz (formularz, XHR, Fetch itp.)

  3. W kodzie .NET otrzymaj ten ciąg i użyj go do odniesienia strefy czasowej i wykonać konwersję. Masz dwie opcje:

    • Możesz użyć Noda Time, przekazując identyfikator strefy czasowej IANA do DateTimeZoneProviders.Tzdb jako pokazane na przykładzie na stronie głównej.

    • Możesz użyć wbudowanego obiektu .NET TimeZoneInfo. Jeśli używasz rdzenia w systemach innych niż Windows (Linux, OSX itp.) Możesz po prostu przekazać identyfikator strefy czasu IANA do TimeZoneInfo.FindSystemTimeZoneById. Jeśli jesteś w systemie Windows, musisz najpierw przekonwertować go na identyfikator strefy czasu systemu Windows ({x3}}). Możesz użyć TZConvert.GetTimeZoneInfo z mojego biblioteki czasowej

  4. Gdy masz DateTimeZone z czasu NODA, LUB TimeZoneInfo Obiektu można użyć metod, aby konwertować wartości UTC do wartości lokalnych w tej strefie czasowej. Każdy z nich będzie stosuje prawidłowe przesunięcie w celu przekształcenia czasu.

Powiem też, wiele aplikacji po prostu poprosi użytkownika o wybranie strefy czasowej z listy rozwijanej i zapisz go w profilu użytkownika. Dopóki przechowujesz ciąg identyfikatora strefy czasowych, a nie tylko offset numeryczny, to podejście jest idealnie dopuszczalne w celu zastąpienia kroków 1 i 2 powyżej.

2
Matt Johnson-Pint 4 sierpień 2020, 18:10