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)?

32voto

Alexander Zinchuk Punkte 652

Für diejenigen, die nach einer reinen Datumslösung suchen, ist es das:

import datetime

datetime.date.today().isoformat()

26voto

jfs Punkte 370717

El ISO 8601 Zeitformat keinen Zeitzonennamen speichert, wird nur der entsprechende UTC-Offset beibehalten.

Konvertierung einer Datei ctime in einen ISO 8601-Zeitstring unter Beibehaltung des UTC-Offsets in Python 3:

>>> import os
>>> from datetime import datetime, timezone
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, timezone.utc)
>>> dt.astimezone().isoformat()
'2015-11-27T00:29:06.839600-05:00'

Der Code geht davon aus, dass Ihre lokale Zeitzone Östliche Zeitzone (ET) und dass Ihr System einen korrekten UTC-Offset für den angegebenen POSIX-Zeitstempel liefert ( ts ), d.h. Python hat Zugriff auf eine historische Zeitzonendatenbank auf Ihrem System oder die Zeitzone hatte zu einem bestimmten Zeitpunkt die gleichen Regeln.

Wenn Sie eine mobile Lösung benötigen; verwenden Sie die pytz Modul die Zugang bietet zu die tz-Datenbank :

>>> import os
>>> from datetime import datetime
>>> import pytz  # pip install pytz
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York'))
>>> dt.isoformat()
'2015-11-27T00:29:06.839600-05:00'

Das Ergebnis ist in diesem Fall das gleiche.

Wenn Sie den Namen/die Abkürzung/die Kennung der Zeitzone benötigen, speichern Sie sie separat.

>>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)')
'2015-11-27 00:29:06-0500 (EST)'

Anmerkung: nein, : im UTC-Offset und EST Die Abkürzung der Zeitzone ist nicht Teil des ISO 8601-Zeitformats. Sie ist nicht eindeutig.

Verschiedene Bibliotheken/verschiedene Versionen derselben Bibliothek können unterschiedliche Zeitzonenregeln für dasselbe Datum/dieselbe Zeitzone verwenden. Wenn es sich um ein zukünftiges Datum handelt, sind die Regeln möglicherweise noch nicht bekannt. Mit anderen Worten, dieselbe UTC-Zeit kann einer anderen Ortszeit entsprechen, je nachdem, welche Regeln Sie verwenden -- das Speichern einer Zeit im ISO 8601-Format bewahrt die UTC-Zeit und die Ortszeit, die dem Datum entspricht. aktuell Zeitzonenregeln, die auf Ihrer Plattform gelten. Möglicherweise müssen Sie die Ortszeit auf einer anderen Plattform neu berechnen, wenn diese andere Regeln hat.

20voto

Max Shawabkeh Punkte 36359

Sie müssen Folgendes verwenden os.stat um die Erstellungszeit der Datei zu ermitteln und eine Kombination aus time.strftime y time.timezone für die Formatierung:

>>> import time
>>> import os
>>> t = os.stat('C:/Path/To/File.txt').st_ctime
>>> t = time.localtime(t)
>>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t)
>>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600)
>>> final = formatted + tz
>>> 
>>> final
'2008-11-24 14:46:08-02.00'

19voto

John_J Punkte 1701

Machen Sie sich das Leben bitte einfach:

  1. UTC-Zeit verwenden
  2. Mikrosekunde
  3. Einzeiliger Code

f"{datetime.datetime.utcnow().isoformat()[:-3]}Z"

Ausgabe:

2022-02-25T02:08:40.684Z

6voto

chronoclast Punkte 41

Standard RFC-3339 in Millisekunden

Ich brauchte die Zeit in diesem Format für eine LoRa-Anwendung, also habe ich mir das hier ausgedacht, ich hoffe, es hilft:

from datetime import datetime
from time import strftime

# Get the current time in the format: 2021-03-20T16:51:23.644+01:00
def rfc3339_time_ms():
        datetime_now = datetime.utcnow()
        # Remove the microseconds
        datetime_now_ms = datetime_now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]
        # Add the timezone as "+/-HHMM", and the colon in "+/-HH:MM"
        datetime_now_ms_tz = datetime_now_ms + strftime("%z")
        rfc3339_ms_now = datetime_now_ms_tz[:-2] + ":" + datetime_now_ms_tz[-2:]
        # print(f"Current time in ms in RFC-3339 format: {rfc3339_ms_now}")
        return rfc3339_ms_now

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