Używanie stref czasowych razem z datą z timestamp

0

Dziwny problem. Generalnie ja się posługuję w aplikacji unixowymi timestampami - konwersję na normalny czas robię dopiero na froncie - przy prezentacji. Zwykle jak chce dodać znacznik, to robię tak:

DateTimeOffset dto = new DateTimeOffset(DateTime.UtcNow);
var data = dto.ToUnixTimeSeconds();

W ten sposób zapisuję to w bazie jako bigint, pobieram na froncie i wszystko działa. Natomiast tym razem dostaję w komunikacie z innego systemu timestamp w postaci DateTime. Robię w ten sposób:

var ts = response.measurements[reg.Id].timeStamp.ToUniversalTime();
DateTimeOffset dto = new DateTimeOffset(ts);
reg.LastMeasured = dto.ToUnixTimeSeconds();

I tu pojawia się problem - timestamp jest przesunięty godzinę w przód. Jak oglądam zmienną dto pod debuggerem, to są tam dwa czasy - Time i LocalTime. Najwyraźniej funkcja konwertująca czas na Epoch pobiera wartość czasu lokalnego a ja za cholerę nie jestem w stanie go przymusić, żeby brał czas UTC.

Jakieś pomysły?

2

DateTime nie niesie informacji o strefie czasowej. Nie mniej, z zewnętrznego systemu dostajesz Timestamp z UTC, tak? W takim razie nie możesz zrobić po prostu:

var dto = new DateTimeOffset(response.measurements[reg.Id].timeStamp);
reg.LastMeasured = dto.ToUnixTimeSeconds();

A tak swoją drogą, nie musisz pisać new DateTimeOffset(DateTime.UtcNow), możesz DateTimeOffset.UtcNow.

0

Już tak robiłem. I efekt jest taki:

image

Wychodzi z tego wartość 1669393476 czyli mniej więcej za godzinę

2

No to pewnie twój deserializer tworzy ten timestamp

response.measurements[reg.Id].timeStamp

z DateTimeKind.Local. Poczytaj o DateTimeZoneHandling.

0
Inclouds napisał(a):

No to pewnie twój deserializer tworzy ten timestamp

response.measurements[reg.Id].timeStamp

z DateTimeKind.Local. Poczytaj o DateTimeZoneHandling.

W końcu tak poszło:

               var ts = response.measurements[reg.Id].timeStamp.Ticks;
               DateTime dt = new DateTime(ts);
               DateTimeOffset dto = new DateTimeOffset(dt);
               reg.LastMeasured = dto.ToUnixTimeSeconds();

1 użytkowników online, w tym zalogowanych: 0, gości: 1