DateTime - Frage

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Roberto.

    DateTime - Frage

    Hallo,

    ich benötige ein Datum z.B. von heute in dieser Form "2020-10-14T17:11:02.000Z"

    Datum und Zeit würde ich noch hinbekommen.
    Was ist mit diesem T (soll ja das Trennzeichen sein von Datum und Zeit)?
    Mit .000Z kann ich eigentlich nichts anfangen.
    Gibt es evtl. eine passende Konvertierung. Bisher habe ich da nichts brauchbares gefunden.
    Wenn jemand mir helfen könnte, würde mich freuen.

    Danke Roberto
    Das was du suchst findest du unter ISO 8601, der Teil zwischen Punkt und Z sind Millisekunden.
    Schau mal hier vorbei: Standard date and time format strings

    Tip: "o"

    Nachtrag:
    Die Zeichenfolge endet nicht immer mit einem Z, das ist die Zeitzone, bei Z ist es UTC, bei anderen Werten mit anderer Zeitzone kann da zb,+02:00 stehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „slice“ ()

    Dim JetztImGewuenschtenFormat = Date.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
    Ist angeblich ne UTC-Zeitformatangabe nach ISO-8601.

    ##########

    Boah, das kommt davon, wenn man viel zu lange am eigenen Post werkelt :S
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Wikipedia schrieb:

    If the time is in UTC, add a Z directly after the time without a space.
    Also ja.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Roberto schrieb:

    mit Z lege ich fest, dass es UTC sein soll.


    Du solltest da besser garnix festlegen.
    Nimm ein Date-Objekt deines Vertrauens, und formatiere es mit "o" als Formatstring. Dann wird es gemäss ISO 8601 formatiert (sagt slice).
    Wenn dein Date gemäss ISO 8601 ein 'Z' am Ende bekommen muss, dann wird es das bekommen.

    VB.NET-Quellcode

    1. dim dt as new date(2001,9,11)
    2. Messagebos.Show(dt.ToString("o"))
    So verstehe ich zumindest post#2.
    Ausprobiert oder gar einen der gegebenen Links nachgelesen habich nicht.
    Dir würdichs aber empfehlen (besonders den zweiten (den kennich nämlich doch)), weil du hast ja damit zu tun.
    Damit gibt's kein Z am Ende. Aber erstmal ein paar Nullen mehr als angegeben.
    Andere Schreibweise, genauso viele unerwünschte Nullen, aber mit nem finalen Z:

    VB.NET-Quellcode

    1. Dim TestDate As New Date(2009, 6, 15, 13, 45, 30, DateTimeKind.Utc)
    2. Dim TestDateInUTC = $"{TestDate:O}"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Dim JetztImGewuenschtenFormat = Date.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
    Ist angeblich ne UTC-Zeitformatangabe nach ISO-8601.

    ##########

    Boah, das kommt davon, wenn man viel zu lange am eigenen Post werkelt :S

    Das führt aber leider zu einer falschen Uhrzeit, dein DateTimeKind ist zb. +2, das du dann aber als "UTC" schreibst, wenn ich das nun richtig verarbeite, ist der Wert um 2 Stunden verschoben.

    Lokale Zeit: 2020-10-14 14:00:00 (UTC+2)
    Dein Format: 2020-10-14T14:00:00.000Z
    Dein Format geparst: 2020-10-14 14:00:00 UTC
    Dein Format in lokaler Zeit: 2020-10-14 16:00:00 (UTC+2)

    Anmerkung:
    Jede vernünftig geschrieben Anwendung die ein Datums-/Uhrzeitwert in dem Format annimmt, kommt auch mit der Zeitzonen Info klar, dementsprechend brauchst du den Wert vorher nicht zu UTC konvertieren, einfach ToString("o") und abschicken.

    @ErfinderDesRades
    Richtig spaßig wird es wenn du damit fast jeden Tag zu tun hast, da gibt es noch einige weitere Stolperfallen.
    Hm, jetzt wird es unklar für mich.
    Vielleicht nochmal das... Ein T als Trennzeichen muss vorhanden sein und wenn das Z am Ende die UTC-Zeit ist,
    dann ist es so wie ich es benötige.

    Die Antwort von VaporiZ (4) ....
    Dim JetztImGewuenschtenFormat = Date.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
    habe ich mal getestet und das sah nicht schlecht aus.

    Habe ich jetzt aber noch nicht verstanden, warum es so nicht richtig ist.
    Oder nochmal gefragt. Wie sollte die Anweisung genau lauten, wenn unbedingt ein Trennzeichen (T) vorhanden sein muss und,
    wenn es eine UTC-Zeit sein muss, also Z am Ende.
    Die beiden Anweisungen sind bei meiner Datumsausgabe Pflicht.

    Danke Roberto
    Das von VaporiZ mag optisch zwar richtig sein, erzeugt aber wenn du nicht in UTC lebst (das System auf dem deine Anwendung läuft) einen falschen Wert.
    Wenn du es unbedingt in UTC brauchst (was unnötig ist), musst du deinen DateTime Wert in UTC verschieben (ToUniversalTime()) und dann formatieren (ToString("o")).

    Roberto schrieb:

    Die beiden Anweisungen sind bei meiner Datumsausgabe Pflicht.
    Welche beiden Anweisungen?
    T oder Z sind Buchstaben - keine Anweisungen.
    Falls du das meinst - es sind sicherlich nicht die Buchstaben, die Pflicht sind.
    Ich vermute, eine Datums-Angabe im ISO-8601 - Format ist Pflicht.
    Vielleicht auch eine Datums-Angabe im UTC-Format der ISO-8601 - Norm.

    Sag du uns, was bei dir die Pflicht ist. "beide Anweisungen" (was immer damit gemeint sein mag) sind es sicher nicht.
    Kurzer Einwurf @slice: Du schreibst, dass das von mir erzeugte Ergebnis optisch korrekt ist. Damit würd ich mich aber zufrieden geben, da es im Post#1 heißt

    Roberto schrieb:

    ich benötige ein Datum z.B. von heute in dieser Form "2020-10-14T17:11:02.000Z"
    Das schafft ja mein Code, wenn man die richtigen Voraussetzungen schafft. Aber Dein ToString("o") erzeugt bei mir nur



    damit ist die Anforderung aus Post#1 nicht erfüllt (Z).
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann schau dir mal dt an, das Ding hat keine Zeitzone, also kann es nicht richtig funktionieren.


    Den String "von Hand" bauen funktioniert nur einwandfrei wenn du sicherstellst das DateTime.Kind = UTC ist.
    Gutem Morgen.

    Zu Antwort 12.
    Sorry, sicherlich ist 'Anweisung' falsch von mir ausgesagt. Eher sollte es heissen, dass das 'T' als Trennzeichen vorhanden sein muss.
    Mit 'Z' ist gemeint, dass es eine UTC sein muss.

    Zu Antwort 13 und 14.
    slice meint, dass die Antwort von VaporiZed falsch ist?
    Vielleicht kann slice seine Datumsanweisung mal so darstellen, damit ich das benötigte Ergebnis
    bekomme so "yyyy-MM-ddTHH:mm:ss.fffZ" bekomme.

    Danke Roberto

    Roberto schrieb:

    Vielleicht kann slice seine Datumsanweisung mal so darstellen,
    Du hast hier hoffentlich gelernt, wie ein DateTime formatiert werden kann.
    Mach Dir ein Testprojekt und probiere alles aus, was hier so steht und auch, was hier nicht steht.
    Die Arbeit machen musst Du selbst!
    Eigentlich erwarten wir nun von Dir, dass Du uns das Resultat zeigst. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Zu Antwort (16)
    Da wird jetzt was in deiner Antwort umgedreht.
    Ich habe ja das Problem und suche die Anweisung wie ich das Resultat bekommen kann
    und du schreibst...
    Eigentlich erwarten wir nun von Dir, dass Du uns das Resultat zeigst. ???
    Danke für deine Antwort. Hilft mir aber leider nicht.

    Vielleicht haben die anderen Kollegen (VaporiZed u. sclice) noch einen anderen Tipp.

    Danke Roberto
    Um ein DateTime in einen ISO-Timestamp zu verwandeln, reicht die Information nicht.
    Wie schon richtig bemerkt wurde, gibt es keine Aussage zur Zeitzone.
    Wer internationale Timestamps benötigt, sollte den Datentyp DateTimeOffset verwenden.

    Wenn man weiß, dass das DateTime in der Lokalzeit des ausführenden Rechners steht, kann man es mit .ToUniversalTime in UTC verwandeln.
    Damit kann man es als UTC betrachten und bei Umwandlung in ISO das Z verwenden.

    Kurz:
    DateTime ist keine vollständige Information für ISO.
    Entweder muss man die Zeitzone wissen und kann es dann in UTC verwandeln.
    Oder besser, man verwendet DateTimeOffset.

    Edit:
    Ich schrieb mir mal einige Extensions, um DateTime und DateTimeOffset in ISO8601 zu verwandeln.
    Vielleicht wird es dadurch klarer.

    VB.NET-Quellcode

    1. <Extension()> Public Function ToIso8601(ts As DateTimeOffset) As String
    2. Return ts.ToString("yyyy-MM-ddTHH:mm:sszzz")
    3. End Function
    4. <Extension()> Public Function ToIso8601Z(ts As DateTimeOffset) As String
    5. Return ts.ToUniversalTime.ToString("yyyy-MM-ddTHH:mm:ssZ")
    6. End Function
    7. <Extension()> Public Function ToIso8601Z(ts As DateTime) As String
    8. Dim tz = New DateTimeOffset(ts)
    9. Return tz.ToIso8601Z
    10. End Function
    11. <Extension()> Public Function ToIso8601(ts As DateTime) As String
    12. Dim tz = New DateTimeOffset(ts)
    13. Return tz.ToIso8601
    14. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Roberto schrieb:

    Zu Antwort 13 und 14.
    slice meint, dass die Antwort von VaporiZed falsch ist?
    Vielleicht kann slice seine Datumsanweisung mal so darstellen, damit ich das benötigte Ergebnis
    bekomme so "yyyy-MM-ddTHH:mm:ss.fffZ" bekomme.
    Wie ich in post#12 schon schrieb:
    Ich kann mir nicht vorstellen, dass allein die Anwesenheit von "Z" in deinem Datum-String die "Pflicht" ist.
    Unser aller Vermutung ist (glaub ich zumindest), dass deine Pflicht ist, ein UTC-Datum als String darzustellen. Oder eines der anderen in ISO 8601 definierten DatumsFormate.
    Da das nur eine Vermutung, bzw. gar eine Unterstellung ist, hatte ich dich danach gefragt - keine Antwort.

    Also wenn du drauf bestehst, dass es auf das "Z" ankommt (egal, was für eine Datum-Art dahintersteht) - dann bist du ja mit Vaporizeds Vorschlag richtig bedient.