Time format von c++ nach c#
-
@Wade1234 sagte in Time format von c++ nach c#:
aber warum bietet c# eigentlich keine möglichkeit, den unixzeitstempel in lokalzeit umzuwandeln?
Ich beantworte mal deine Frage: https://docs.microsoft.com/de-de/dotnet/api/system.datetimeoffset.fromunixtimeseconds?view=netframework-4.7.2
-
und warum wird das dann nicht verwendet?
-
@Wade1234 sagte in Time format von c++ nach c#:
und warum wird das dann nicht verwendet?
Die Präzision spielt eigentlich keine so große Rolle. Schaden tut sie allerdings auch nicht. Vorteil die Zeit war leserlich in der json Struktur. Aber auch nicht entscheidend.
also mit
auto now = std::chrono::system_clock::now();
erhalte ich einen time_point. Den wandle ich dann mit
now.time_since_epoch().count();
in einen int ?? Den kann ich dann an c# übertragen. Richtig?
-
@booster hast du es versucht? wenn ja: funktionierts? wenn nein: was ist falsch?
-
ja habe es versucht.
ja es funktioniert.
mir war nur nicht klar ob das dann die richtige vorgehensweise ist.
Aber danke.
-
es gibt doch system_clock::to_time_t, was, wenn ich das jetzt nicht falsch sehe, den unixzeitstempel ergibt. den kannst du dann an c# übertragen und da umwandeln. ganz ohne aufwand und ohne #define _CRT_SECURE_NO_WARNINGS.
-
@Wade1234 sagte in Time format von c++ nach c#:
es gibt doch system_clock::to_time_t, was, wenn ich das jetzt nicht falsch sehe, den unixzeitstempel ergibt
ja, und was macht time_since_epoch()?
-
wenn ich das richtig sehe, mikrosekunden dran hängen. keine ahnung, dein problem ist ja gelöst.
-
Problem ist gelöst. Das mit dem to_time_t hatte ich mir auch angeschaut. Aber nicht ganz verstanden was der unterschied ist zu time_since_epoch().
Darum habe ich gefragt ob meine Lösung die richtige ist. Man will ja nicht nur das Problem lösen sondern auch was dazu lernen.
-
Die Genauigkeit von time_t ist implementierungsspezifisch.
https://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t
-
naja time_t ist immer eine ganze anzahl von sekunden seit dem 1.1.1970, das ist für uhrzeiten eigentlich genau genug.
also ich würde dann eher sagen, dass to_time_t das richtige ist, weil das ja auch das ist, was fromunixtimeseconds unter c# dann erwartet. aber warum funktioniert time_since_epoch dann?
-
@booster sagte in Time format von c++ nach c#:
ja, und was macht time_since_epoch()?
Das gibt die Anzahl der "Ticks" seit der epoch an.
Wobei die "Ticks" nicht unbedingt Sekunden sind. Das hängt von deiner time_point-Genauigkeit ab.Beispiel:
auto n = chrono::system_clock::now() (std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long, std::ratio<1, 1000000000> > > &) @0x7f714c619010 n.time_since_epoch().count() (long) 1550837538050613745 // In der Einheit std::ratio<1, 1000000000>, also 1 ns auto h = std::chrono::time_point_cast<std::chrono::hours>(n) (std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long, std::ratio<3600, 1> > > &) @0x7f714c619018 h.time_since_epoch().count() (long) 430788 // in der Einheit std::ratio<3600, 1>, also 3600 Sekunden, also 1 Stunde
time_since_epoch().count()
ist also nur dann in Sekunden (seit 1970*), wenn du als Duration-Einheit die Sekunde hast.* nur per Konvention, nicht vom Standard garantiert