2016-11-14 1 views
1

So habe ich versucht, ein Zeitformat zu meinen REST-Aufrufen in Python hinzuzufügen, aber es scheint immer eine Art von Problem zu geben, vor allem hier ist die Zeitformat Anforderung, und es muss genau sein, oder es wird leider nicht funktionieren.Behalten Sie ein seltsames Zeitformat, und fügen Sie Werte in Python hinzu

Verwenden Sie das folgende ISO-8601-kompatible Datums-/Uhrzeitformat in Anforderungsparametern.

yyyy-MM-dd'T'HH: mm: ss.SSSXXX

Zum Beispiel, den 26. Mai 2014 21.49.46 Uhr könnte ein Format wie eine der folgenden Möglichkeiten haben:

l In PDT: 2014-05-26T21: 49: 46,000 bis 07: 00

l In UTC: 2014-05-26T21: 49: 46.000Z

Code Beschreibung

  • yyyy Jahr vierstellig
  • MM Zweistellige Monat (01 = Januar etc.)
  • dd Zweistellige Tag des Monats (01 bis 31)
  • T Separator für Datum/Uhrzeit
  • HH Zwei Ziffern Stunde (00 bis 23) (am/pm NICHT erlaubt)
  • mm Zwei Ziffern der Minute (00 bis 59)
  • ss zwei Stellen der zweiten (00 bis 59)
  • SSS Drei digit Millisekunden der zweiten
  • XXX ISO 8601 Zeitzone (Z + oder hh: mm oder -hh: mm)

So, was ich versucht habe vor ist:

def format_time(self, isnow): 
    currentdt = datetime.datetime.utcnow() 
    if not isnow: 
     currentdt += datetime.timedelta(0,3) 
    (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
    dt = "%s.%03dZ" % (dt, int(micro)/1000) 
    return dt 

Nun, das es in das irgendwie richtigen Format zurückkehren könnte, aber es ist immer noch das Problem mit Zeitzonen.

Das Endergebnis, das ich versuche zu erreichen, ist, wenn ich dies ausführe, es findet die aktuelle Zeit, (Amsterdam Zeitzone/GMT/UTC + 1), und erstellt es in diesem Format. Und die else-Anweisung, um die gleiche Zeit zu erhalten, aber X Sekunden anhängen.

Würde jemand so freundlich sein, mir hier zu helfen?

+0

Tangente, die Ihr Problem nicht lösen wird, aber Ihren Code einfacher zu verwalten macht (und Ihr Problem einfacher zu beantworten): 'currentdt = datetime.datetime.utcnow()' 'wenn nicht isnow: currentdt + = datetime. timedelta (0,3) '' (dt, etc ... 'Mit anderen Worten, das einzige Ding im if-Block sollte nur das timedelta sein. Das trennt Sie davon, die Zeit von der Formatierung der Zeit zu bekommen. Ich kann es umschreiben für Sie in Ihrer Frage, wenn Sie wollen. (Normalerweise ändern Redakteure nicht Code-Blöcke, seitdem ändern sie die Frage.) Ich würde auch die unnötige Vulgarität bearbeiten, während ich dort bin ... –

+0

@ ScottMermelstein Habe den Funktionsnamen geändert, sorry dazu Wenn ich deinen anderen Punkt verstanden habe, willst du, dass ich das ausprobiere, was ich gerade probiert habe, zu einem vereinfachten Format, und dann sehen, ob mir jemand eine Antwort geben kann? – Marius

+0

Es ist eine Empfehlung, keine Voraussetzung. Wenn Sie das vereinfachte Format verwenden, müssen Sie nur eine Codezeile korrigieren. So wie es ist, sind von den 10 Zeilen, die Sie gepostet haben, 3 von ihnen eine Kopie der anderen 3. Und da das Problem in diesen 3 Zeilen liegt, wäre es sauberer, auf diese Weise zu sprechen. Ich werde die Änderung vornehmen, weil es viel einfacher ist, die Frage zu stellen als in einem Kommentar; Wenn Ihnen das nicht gefällt, klicken Sie auf "vor X min. bearbeitet" und rollen Sie es zurück. –

Antwort

1

Ok, also hast du die Mikrosekunden als Millisekunden formatiert, gut gemacht dort.

Jetzt ist Ihre Herausforderung, den Zeitzonenversatz zu behandeln; es kann nicht nur Z sein.

Und um die Dinge schwieriger zu machen, strftime 's %z Format gibt + (oder -) HHMM, anstelle von HH: MM.

So müssen Sie damit umgehen.Hier ist eine Möglichkeit, es zu tun:

Python 3:

def format_time(self, isnow): 
    currentdt = datetime.datetime.now(datetime.timezone.utc) 
    if not isnow: 
     currentdt += datetime.timedelta(0,3) 
    (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
    tz_offset = currentdt.astimezone().strftime('%z') 
    tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:] 

    dt = "%s.%03d%s" % (dt, int(micro)/1000, tz_offset) 
    return dt 

Python 2:

import pytz 
from dateutil.tz import * 

def format_time(self, isnow): 
    currentdt = datetime.datetime.now(pytz.utc) 
    if not isnow: 
     currentdt += datetime.timedelta(0,3) 
    (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
    tz_offset = currentdt.astimezone(tzlocal()).strftime('%z') 
    tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:] 

    dt = "%s.%03d%s" % (dt, int(micro)/1000, tz_offset) 
    return dt 

Antwort auf Kommentar: ich ein paar Änderungen vorzunehmen benötigt. Es ist bemerkenswert nicht trivial, die aktuelle Zeitzone zu finden. Der einfachste Weg, den ich finden konnte, war von https://stackoverflow.com/a/25887393/1404311 und ich habe diese Konzepte in den Code integriert, der jetzt oben ist.

Grundsätzlich sollten Sie statt utcnow()now(datetime.timezone.utc) verwenden. Ersteres gibt eine naive Datetime, während letzteres eine auf UTC gesetzte Datetime angibt, aber bewusst ist, dass es ist. Verwenden Sie dann astimezone(), um auf Ihre lokale Zeitzone aufmerksam zu machen, und verwenden Sie dann strftime('%z'), um die Zeitzone von dort zu erhalten. DANN gehen Sie durch die String-Manipulation.

+0

Hmm, okay, das scheint machbar, aber zuerst, was soll das sonst hier bedeuten? 'tz =" Z "wenn tz ==" else ". Das würde mir einen Fehler geben. Auch, wie könnte dies dann in die richtige Zeitzone umgewandelt werden? Ist die Zeit immer gleich, und wenn ich das Extra "00:00" am Ende des Zeitformats hinzufüge, wird es konvertiert? – Marius

+0

Ack. Entschuldigung, ich bin mir nicht sicher, warum ich meinen Code nicht fertig bearbeitet habe. Fixed ... –

+0

Ok, meine Änderungen sollten Ihnen jetzt mehr Zeitzonenbewusstsein geben. :-) –

Verwandte Themen