.Net5 Api konwersja czasu UTC <-> Local

.Net5 Api konwersja czasu UTC <-> Local
BL
  • Rejestracja:ponad 4 lata
  • Ostatnio:około rok
  • Postów:68
0

Cześć,
w DB mam zapisane wszystkie daty w czasie UTC, korzystam z EF Core 5 i chciałbym po stronie backendu po pobraniu danych konwertować daty na czas lokalny zalogowanego usera, a przed zapisem konwertować na czas UTC.

Po wygenerowaniu modelu w DBContext mam:

Kopiuj
entity.Property(e => e.StartTime)
.HasColumnType("datetime")
.HasColumnName("START_TIME");

Także nie wygenerował żadnego specify kind, więc rozumiem że po pobraniu nie bedzie kind zdefiniowany, a data będzie dokładnie taka jak w DB?

I tu teraz moje pytania:

  1. Co powinienem dostać z frontendu, żebym był w stanie konwertować czas na czas lokalny zalogowanego usera? Ludzie mogą się logować z różnych części świata gdzie różnica między local a utc będzie różna, więc nie mogę brać pod uwagę strefy czasowej serwera.
  2. Czy w EF można jakoś to zautomatyzować żeby sam przeliczał czasy po pobraniu i przed zapisem dla kolumn typu datetime? czy będę musiał sam ręcznie zawsze to zapewniać?
UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:2206
1
blane napisał(a):

:

  1. Co powinienem dostać z frontendu, żebym był w stanie konwertować czas na czas lokalny zalogowanego usera? Ludzie mogą się logować z różnych części świata gdzie różnica między local a utc będzie różna, więc nie mogę brać pod uwagę strefy czasowej serwera.

Lokalny czas użytkownika i strefę czasową albo przesuniecie strefy użytkownika względem UTC tak żebyś mógł znormalizować do utc.

BL
Rozumiem czyli jakiś TimeZoneOffset np. w godzinach, a odnośnie drugiej pytania ?
UglyMan
Taki jakiś offset. Co do drugiego to nie znam sie na EF, ale może to pomoże: https://plawgo.pl/2018/08/21/jak-automatycznie-zmieniac-czas-lokalny-na-utc-w-asp-net-mvc/
Miang
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 godzin
  • Postów:1680
1

@blane: ale to właśnie wygląda na zadanie dla frontu


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
BL
  • Rejestracja:ponad 4 lata
  • Ostatnio:około rok
  • Postów:68
0

Poprawnie jest aby front zawsze dbał o konwersję? a backend tylko i wyłącznie komunikuje się po UTC?

Miang
lepiej żeb y dane z backendu znaczyły to samo w każdej części świata która zada zapytanie
BL
No tak, ale dane zwracane będą tylko dla zalogowanego usera, więc gdziekolwiek się nie zalogujesz zawsze dostaniesz czas lokalny
Miang
co znaczy "dostanę cas lokalny" ?
BL
No na zewnątrz zawszy wyjdzie czas lokalny użytkownika.
Miang
no dobra, ale skąd serwer będzie wiedział jaka strefę czasową ma użytkownik? i czy ta wiedza jest mu jeszcze do czegoś potrzebna ?
BL
No dostanie podczas logowania TimeZoneOffset.
Miang
ale do czego mu to jest potrzebne, temu serweru?
BL
No żeby wiedział o ile zrobić przesunięcie?
Miang
jeszcze raz jeżeli serwer potrzebuje jakieś informacji tylko po to żeby użytkownik zobaczył ładnie wyświetlony tekst to tak naprtawę nie potrzebuje, bo ładne wyświetlanie to jjst zadanie dla przeglądarki
BL
Ale my nie mówimy o ładnym wyświetlaniu tekstu, tylko o konwersji Dat miedzy Local a Utc
Miang
a po co ta konwersja jest potrzebna?
BL
A co chcesz pokazywać użytkownikom czas UTC na stronie? I taki gość z Chille się zaloguje o 07:00 lokalnego czasu, a na stronie będzie widział 13:00?
Miang
tylko dlaczego miałby o tym wiedzieć serwer?
BL
Nie wiem dlatego pytam :)
Miang
a ja po to pytam żebyś się zorientował że może to robić front bo serwer nie potrzebuje do niczego tych informacji
BL
Ale mówisz że mam się zorientować bo nie masz pewności? czy ją masz i tak się to powinno odbywać :)?
bakunet
  • Rejestracja:około 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Polska
  • Postów:1609
0

Może to być rozwiązaniem na około, ale możesz też z kontekstu pobierać IP i przez jakieś darmowe API szukać dla niego godziny.

Zobacz pozostały 1 komentarz
bakunet
Zgadzam się, jest szansa na to, że użytkownik korzysta z VPN / PROXY
BL
No ale z frontendu jestem w stanie wyciągnąć offset i wysłać do bacnekdu to już wiem, tylko czy można jakimś automatem daty konwertować w dwie strony czy będę musiał ręcznie to przerabiać przed wysłaniem i zwróceniem.
UglyMan
A w tym całym Entity czy jak to sie tam nazwy na set i get nie można tego przekonwertować ?
BL
Nie widziałem takiej możliwośći, jedyne co znalazłem to extension ktory domyślnie po pobraniu ustawia Kind UTC, bo normalnie jest unknown, ale to nadal nie bedzie przeliczać nic
Miang
użyszkodnik może w ogóle mieć na swoim kompie ustawioną inną strefę
BO
  • Rejestracja:około 6 lat
  • Ostatnio:10 dni
  • Postów:214
0

Ad2. Może chodzi ci o ComputedColumn? Spokojnie da się takie coś zrobić w EFcore jest dużo przykładów po wpisaniu tego w google. Ale nie jestem pewny czy o to ci chodzi. W takiej sytuacji w jednej kolumnie wpisujesz sobie czas od użytkownika (tylko musiałbyś mieć go mieć do profilu przypisane a nie każdorazowo być pobierany) w innej czas UTC i sama ci się trzecia kolumna liczy.

edytowany 1x, ostatnio: Botek

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.