662 Stimmen

ISO-Zeit (ISO 8601) in Python

Ich habe eine Datei. In Python möchte ich ihre Erstellungszeit nehmen und sie in eine ISO-Zeit (ISO 8601) Zeichenfolge unter Beibehaltung der Tatsache, dass sie in der Östliche Zeitzone (ET) .

Wie kann ich die ctime der Datei in einen ISO-Zeitstring umwandeln, der die östliche Zeitzone angibt (und gegebenenfalls die Sommerzeit berücksichtigt)?

4voto

Jarek Przygódzki Punkte 4004

Korrigieren Sie mich, wenn ich falsch liege (ich liege nicht falsch), aber die Abweichung von der UTC ändert sich mit der Sommerzeit. Sie sollten also verwenden

tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)

Ich glaube auch, dass das Zeichen anders sein sollte:

tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)

Ich könnte mich irren, aber ich glaube nicht, dass dies der Fall ist.

3voto

Sharpiro Punkte 2194

Hinzufügen einer kleinen Variation zu estanis ausgezeichnete Antwort

Lokal nach ISO 8601 mit TimeZone und no Mikrosekunden-Info (Python 3):

import datetime, time

utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
datetime.datetime.now().replace(microsecond=0, tzinfo=datetime.timezone(offset=utc_offset)).isoformat()

Beispielhafte Ausgabe:

'2019-11-06T12:12:06-08:00'

Getestet, dass diese Ausgabe sowohl von Javascript Date und C# DateTime / DateTimeOffset

2voto

mattbornski Punkte 10815

Ich stimme Jarek zu und stelle außerdem fest, dass das ISO-Offset-Trennzeichen ein Doppelpunkt ist, so dass die endgültige Antwort meiner Meinung nach lauten sollte:

isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')

1voto

Andre Avilla Punkte 27

Ich habe diese Funktion entwickelt:

def iso_8601_format(dt):
    """YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)"""

    if dt is None:
        return ""

    fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S')
    tz = dt.utcoffset()
    if tz is None:
        fmt_timezone = "+00:00"
    else:
        fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600))

    return fmt_datetime + fmt_timezone

-6voto

ronak Punkte 1588
import datetime, time    
def convert_enddate_to_seconds(self, ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
     dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds 

>>> import datetime, time
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
>>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
>>> seconds
1348990310.26

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X