datetime — Grundlegende Datums- und Zeittypen¶
Quellcode: Lib/datetime.py
Das Modul datetime stellt Klassen zur Bearbeitung von Daten und Zeiten bereit.
Während Datum- und Zeitarithmetik unterstützt wird, liegt der Fokus der Implementierung auf der effizienten Extraktion von Attributen für die Ausgabeformatierung und -bearbeitung.
Tipp
Springen Sie zu den Formatcodes.
Siehe auch
- Modul
calendar Allgemeine kalenderbezogene Funktionen.
- Modul
time Zeitzugriff und -konvertierungen.
- Modul
zoneinfo Konkrete Zeitzonen, die die IANA-Zeitzonendatenbank darstellen.
- Paket dateutil
Drittanbieterbibliothek mit erweiterter Unterstützung für Zeitzonen und Parsing.
- Paket DateType
Drittanbieterbibliothek, die unterscheidbare statische Typen einführt, um z. B. statische Typ-Checker zwischen naiven und bewussten Datums- und Zeitangaben unterscheiden zu lassen.
Bewusste und naive Objekte¶
Datums- und Zeitobjekte können als „bewusst“ oder „naiv“ kategorisiert werden, je nachdem, ob sie Zeitzoneninformationen enthalten oder nicht.
Mit ausreichendem Wissen über anwendbare algorithmische und politische Zeitanpassungen, wie Zeitzonen- und Sommerzeitinformationen, kann ein **bewusstes** Objekt sich relativ zu anderen bewussten Objekten lokalisieren. Ein bewusstes Objekt repräsentiert einen bestimmten Zeitpunkt, der keiner Interpretation offensteht. [1]
Ein **naives** Objekt enthält nicht genügend Informationen, um sich eindeutig relativ zu anderen Datums-/Zeitobjekten zu lokalisieren. Ob ein naives Objekt die koordinierte Weltzeit (UTC), die Lokalzeit oder eine Zeit in einer anderen Zeitzone repräsentiert, liegt allein beim Programm, genau wie es beim Programm liegt, ob eine bestimmte Zahl Meter, Meilen oder Masse darstellt. Naive Objekte sind einfach zu verstehen und zu handhaben, auf Kosten der Ignorierung einiger Aspekte der Realität.
Für Anwendungen, die bewusste Objekte benötigen, verfügen datetime- und time-Objekte über ein optionales Zeitzoneninformationsattribut, tzinfo, das auf eine Instanz einer Unterklasse der abstrakten tzinfo-Klasse gesetzt werden kann. Diese tzinfo-Objekte erfassen Informationen über die Abweichung von der UTC-Zeit, den Namen der Zeitzone und ob die Sommerzeit in Kraft ist.
Nur eine konkrete tzinfo-Klasse, die timezone-Klasse, wird vom Modul datetime bereitgestellt. Die timezone-Klasse kann einfache Zeitzonen mit festen Abweichungen von UTC darstellen, wie z. B. UTC selbst oder die nordamerikanischen Zeitzonen EST und EDT. Die Unterstützung von Zeitzonen mit detaillierteren Regeln obliegt der Anwendung. Die Regeln für Zeitanpassungen auf der ganzen Welt sind eher politisch als rational, ändern sich häufig, und es gibt keine für jede Anwendung geeignete Standard außer UTC.
Konstanten¶
Das Modul datetime exportiert folgende Konstanten
- datetime.MINYEAR¶
Die kleinste erlaubte Jahreszahl in einem
date- oderdatetime-Objekt.MINYEARist 1.
- datetime.MAXYEAR¶
Die größte erlaubte Jahreszahl in einem
date- oderdatetime-Objekt.MAXYEARist 9999.
- datetime.UTC¶
Alias für das UTC-Zeitzonen-Singleton
datetime.timezone.utc.Hinzugefügt in Version 3.11.
Verfügbare Typen¶
- class datetime.date
Ein idealisiertes naives Datum, das davon ausgeht, dass der aktuelle Gregorianische Kalender immer gültig war und immer gültig sein wird. Attribute:
year,monthundday.
- class datetime.time
Eine idealisierte Zeit, unabhängig von einem bestimmten Tag, unter der Annahme, dass jeder Tag genau 24*60*60 Sekunden hat. (Hier gibt es keine „Schaltsekunden“.) Attribute:
hour,minute,second,microsecondundtzinfo.
- class datetime.datetime
Eine Kombination aus Datum und Uhrzeit. Attribute:
year,month,day,hour,minute,second,microsecondundtzinfo.
- class datetime.timedelta
Eine Dauer, die die Differenz zwischen zwei
datetime- oderdate-Instanzen mit Mikrosekundenauflösung ausdrückt.
- class datetime.tzinfo
Eine abstrakte Basisklasse für Zeitzoneninformationsobjekte. Diese werden von den Klassen
datetimeundtimeverwendet, um eine anpassbare Vorstellung von Zeitanpassungen (z. B. zur Berücksichtigung von Zeitzonen und/oder Sommerzeit) bereitzustellen.
- class datetime.timezone
Eine Klasse, die die abstrakte Basisklasse
tzinfoals feste Abweichung von UTC implementiert.Hinzugefügt in Version 3.2.
Objekte dieser Typen sind unveränderlich.
Unterklassenbeziehungen
object
timedelta
tzinfo
timezone
time
date
datetime
Gemeinsame Eigenschaften¶
Die Typen date, datetime, time und timezone teilen sich diese gemeinsamen Merkmale
Feststellen, ob ein Objekt bewusst oder naiv ist¶
Objekte des Typs date sind immer naiv.
Ein Objekt vom Typ time oder datetime kann bewusst oder naiv sein.
Ein datetime-Objekt d ist bewusst, wenn beides zutrifft
d.tzinfoist nichtNoned.tzinfo.utcoffset(d)gibt nichtNonezurück
Andernfalls ist d naiv.
Ein time-Objekt t ist bewusst, wenn beides zutrifft
t.tzinfoist nichtNonet.tzinfo.utcoffset(None)gibt nichtNonezurück.
Andernfalls ist t naiv.
Die Unterscheidung zwischen bewusst und naiv trifft auf timedelta-Objekte nicht zu.
timedelta-Objekte¶
Ein timedelta-Objekt repräsentiert eine Dauer, die Differenz zwischen zwei datetime- oder date-Instanzen.
- class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶
Alle Argumente sind optional und standardmäßig 0. Argumente können ganze Zahlen oder Gleitkommazahlen sein und positiv oder negativ sein.
Nur *Tage*, *Sekunden* und *Mikrosekunden* werden intern gespeichert. Argumente werden in diese Einheiten umgewandelt
Eine Millisekunde wird in 1000 Mikrosekunden umgewandelt.
Eine Minute wird in 60 Sekunden umgewandelt.
Eine Stunde wird in 3600 Sekunden umgewandelt.
Eine Woche wird in 7 Tage umgewandelt.
und Tage, Sekunden und Mikrosekunden werden dann normalisiert, sodass die Darstellung eindeutig ist, mit
0 <= Mikrosekunden < 10000000 <= Sekunden < 3600*24(die Anzahl der Sekunden in einem Tag)-999999999 <= Tage <= 999999999
Das folgende Beispiel verdeutlicht, wie alle Argumente außer *Tage*, *Sekunden* und *Mikrosekunden* „zusammengefasst“ und in diese drei resultierenden Attribute normalisiert werden
>>> from datetime import timedelta >>> delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Only days, seconds, and microseconds remain >>> delta datetime.timedelta(days=64, seconds=29156, microseconds=10)
Wenn ein Argument eine Gleitkommazahl ist und es Bruchteile von Mikrosekunden gibt, werden die verbleibenden Bruchteile von allen Argumenten kombiniert und ihre Summe wird zur nächsten Mikrosekunde gerundet, wobei die round-half-to-even-Regel für Gleichstände angewendet wird. Wenn kein Argument eine Gleitkommazahl ist, sind die Konvertierungs- und Normalisierungsprozesse exakt (es gehen keine Informationen verloren).
Wenn der normalisierte Wert von Tagen außerhalb des angegebenen Bereichs liegt, wird
OverflowErrorausgelöst.Beachten Sie, dass die Normalisierung negativer Werte auf den ersten Blick überraschend sein kann. Zum Beispiel
>>> from datetime import timedelta >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
Da die String-Darstellung von
timedelta-Objekten verwirrend sein kann, verwenden Sie das folgende Rezept, um ein lesbareres Format zu erzeugen>>> def pretty_timedelta(td): ... if td.days >= 0: ... return str(td) ... return f'-({-td!s})' ... >>> d = timedelta(hours=-1) >>> str(d) # not human-friendly '-1 day, 23:00:00' >>> pretty_timedelta(d) '-(1:00:00)'
Klassenattribute
- timedelta.max¶
Das positivste
timedelta-Objekt,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
- timedelta.resolution¶
Die kleinstmögliche Differenz zwischen ungleichen
timedelta-Objekten,timedelta(microseconds=1).
Beachten Sie, dass aufgrund der Normalisierung timedelta.max größer ist als -timedelta.min. -timedelta.max ist nicht als timedelta-Objekt darstellbar.
Instanzattribute (schreibgeschützt)
- timedelta.days¶
Zwischen -999.999.999 und 999.999.999 einschließlich.
- timedelta.seconds¶
Zwischen 0 und 86.399 einschließlich.
Vorsicht
Es ist ein häufiger Fehler, dass Code dieses Attribut unbeabsichtigt verwendet, wenn eigentlich ein
total_seconds()-Wert gemeint ist>>> from datetime import timedelta >>> duration = timedelta(seconds=11235813) >>> duration.days, duration.seconds (130, 3813) >>> duration.total_seconds() 11235813.0
- timedelta.microseconds¶
Zwischen 0 und 999.999 einschließlich.
Unterstützte Operationen
Operation |
Ergebnis |
|---|---|
|
Summe von |
|
Differenz von |
|
Delta multipliziert mit einer ganzen Zahl. Danach gilt |
Allgemein gilt |
|
|
Delta multipliziert mit einer Gleitkommazahl. Das Ergebnis wird auf das nächste Vielfache von timedelta.resolution gerundet, wobei round-half-to-even verwendet wird. |
|
Division (3) der Gesamt dauer |
|
Delta geteilt durch eine Gleitkommazahl oder eine ganze Zahl. Das Ergebnis wird auf das nächste Vielfache von timedelta.resolution gerundet, wobei round-half-to-even verwendet wird. |
|
Der ganzzahlige Anteil wird berechnet und der Rest (falls vorhanden) wird verworfen. Im zweiten Fall wird eine ganze Zahl zurückgegeben. (3) |
|
Der Rest wird als |
|
Berechnet den Quotienten und den Rest: |
|
Gibt ein |
|
Entspricht |
|
Entspricht |
|
Gibt eine Zeichenkette im Format |
|
Gibt eine String-Darstellung des |
Hinweise
Dies ist exakt, kann aber überlaufen.
Dies ist exakt und kann nicht überlaufen.
Division durch Null löst
ZeroDivisionErroraus.-timedelta.maxist nicht alstimedelta-Objekt darstellbar.String-Darstellungen von
timedelta-Objekten werden ähnlich wie ihre interne Darstellung normalisiert. Dies führt zu etwas ungewöhnlichen Ergebnissen für negative Zeitspannen. Zum Beispiel>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
Der Ausdruck
t2 - t3ist immer gleich dem Ausdruckt2 + (-t3), außer wenn t3 gleichtimedelta.maxist; in diesem Fall liefert der erste ein Ergebnis, während der zweite überläuft.
Zusätzlich zu den oben aufgeführten Operationen unterstützen timedelta-Objekte bestimmte Additionen und Subtraktionen mit date- und datetime-Objekten (siehe unten).
Geändert in Version 3.2: Ganzzahlige Division und reelle Division eines timedelta-Objekts durch ein anderes timedelta-Objekt werden nun unterstützt, ebenso wie Restoperationen und die divmod()-Funktion. Reelle Division und Multiplikation eines timedelta-Objekts durch ein float-Objekt werden nun unterstützt.
timedelta-Objekte unterstützen Gleichheits- und Ordnungsvergleiche.
In booleschen Kontexten wird ein timedelta-Objekt genau dann als wahr betrachtet, wenn es nicht gleich timedelta(0) ist.
Instanzmethoden
- timedelta.total_seconds()¶
Gibt die Gesamtzahl der Sekunden in der Dauer zurück. Entspricht
td / timedelta(seconds=1). Für andere Einheiten als Sekunden verwenden Sie direkt die Divisionsform (z.B.td / timedelta(microseconds=1)).Beachten Sie, dass diese Methode bei sehr großen Zeitintervallen (auf den meisten Plattformen mehr als 270 Jahre) die Mikrosekunden-Genauigkeit verliert.
Hinzugefügt in Version 3.2.
Anwendungsbeispiele: timedelta¶
Ein zusätzliches Beispiel für Normalisierung
>>> # Components of another_year add up to exactly 365 days
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23,
... minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
Beispiele für timedelta-Arithmetik
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
date Objekte¶
Ein date-Objekt repräsentiert ein Datum (Jahr, Monat und Tag) in einem idealisierten Kalender, dem aktuellen gregorianischen Kalender, der in beide Richtungen unbegrenzt erweitert ist.
Der 1. Januar des Jahres 1 wird als Tag Nummer 1 bezeichnet, der 2. Januar des Jahres 1 als Tag Nummer 2 und so weiter. [2]
- class datetime.date(year, month, day)¶
Alle Argumente sind erforderlich. Die Argumente müssen Ganzzahlen sein und innerhalb der folgenden Bereiche liegen
MINYEAR <= year <= MAXYEAR1 <= month <= 121 <= day <= Anzahl der Tage im gegebenen Monat und Jahr
Wenn ein Argument außerhalb dieser Bereiche angegeben wird, wird
ValueErrorausgelöst.
Andere Konstruktoren, alle Klassenmethoden
- classmethod date.today()¶
Gibt das aktuelle lokale Datum zurück.
Dies entspricht
date.fromtimestamp(time.time()).
- classmethod date.fromtimestamp(timestamp)¶
Gibt das lokale Datum zurück, das dem POSIX-Timestamp entspricht, wie er von
time.time()zurückgegeben wird.Dies kann
OverflowErrorauslösen, wenn der Timestamp außerhalb des Bereichs der von der plattformspezifischen C-Funktionlocaltime()unterstützten Werte liegt, undOSErrorbei einem Fehler vonlocaltime(). Es ist üblich, dass dies auf Jahre von 1970 bis 2038 beschränkt ist. Beachten Sie, dass auf Nicht-POSIX-Systemen, die Schaltsekunden in ihrer Zeitmessung berücksichtigen, Schaltsekunden vonfromtimestamp()ignoriert werden.Geändert in Version 3.3: Löst
OverflowErroranstelle vonValueErroraus, wenn der Timestamp außerhalb des Bereichs der von der plattformspezifischen C-Funktionlocaltime()unterstützten Werte liegt. LöstOSErroranstelle vonValueErrorbei einem Fehler vonlocaltime()aus.
- classmethod date.fromordinal(ordinal)¶
Gibt das Datum zurück, das dem proleptischen gregorianischen Ordinalzahl entspricht, bei dem der 1. Januar des Jahres 1 die Ordinalzahl 1 hat.
ValueErrorwird ausgelöst, es sei denn,1 <= ordinal <= date.max.toordinal(). Für jedes Datumdgilt:date.fromordinal(d.toordinal()) == d.
- classmethod date.fromisoformat(date_string)¶
Gibt ein
datezurück, das einer date_string in einem beliebigen gültigen ISO 8601-Format entspricht, mit den folgenden AusnahmenDaten mit reduzierter Genauigkeit werden derzeit nicht unterstützt (
YYYY-MM,YYYY).Erweiterte Datumsdarstellungen werden derzeit nicht unterstützt (
±YYYYYY-MM-DD).Ordinaldatumsangaben werden derzeit nicht unterstützt (
YYYY-OOO).
Beispiele
>>> from datetime import date >>> date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) >>> date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> date.fromisoformat('2021-W01-1') datetime.date(2021, 1, 4)
Hinzugefügt in Version 3.7.
Geändert in Version 3.11: Zuvor unterstützte diese Methode nur das Format
YYYY-MM-DD.
- classmethod date.fromisocalendar(year, week, day)¶
Gibt ein
datezurück, das dem durch Jahr, Woche und Tag angegebenen ISO-Kalenderdatum entspricht. Dies ist die Umkehrung der Funktiondate.isocalendar().Hinzugefügt in Version 3.8.
- classmethod date.strptime(date_string, format)¶
Gibt ein
datezurück, das der date_string entspricht, analysiert gemäß format. Dies entsprichtdate(*(time.strptime(date_string, format)[0:3]))
ValueErrorwird ausgelöst, wenn die date_string und das Format nicht vontime.strptime()analysiert werden können oder wenn ein Wert zurückgegeben wird, der kein Zeittupel ist. Siehe auch strftime() und strptime() Verhalten unddate.fromisoformat().Hinweis
Wenn format einen Tag ohne Jahr angibt, wird eine
DeprecationWarningausgegeben. Dies dient dazu, einen vierjährigen Schaltjahresfehler in Code zu vermeiden, der nur einen Monat und Tag als Standardjahr analysieren möchte, wenn keines im Format angegeben ist, da dieses Standardjahr kein Schaltjahr ist. Solche format-Werte können ab Python 3.15 eine Fehlermeldung auslösen. Die Umgehung besteht darin, immer ein Jahr in Ihrem format einzuschließen. Wenn Sie date_string-Werte parsen, die kein Jahr enthalten, fügen Sie explizit ein Schaltjahr hinzu, bevor Sie parsen.>>> from datetime import date >>> date_string = "02/29" >>> when = date.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug. >>> when.strftime("%B %d") 'February 29'
Hinzugefügt in Version 3.14.
Klassenattribute
- date.min¶
Das früheste darstellbare Datum,
date(MINYEAR, 1, 1).
- date.max¶
Das späteste darstellbare Datum,
date(MAXYEAR, 12, 31).
- date.resolution¶
Die kleinste mögliche Differenz zwischen nicht-gleichen Datumsobjekten,
timedelta(days=1).
Instanzattribute (schreibgeschützt)
- date.month¶
Zwischen 1 und 12 einschließlich.
- date.day¶
Zwischen 1 und der Anzahl der Tage im gegebenen Monat des gegebenen Jahres.
Unterstützte Operationen
Operation |
Ergebnis |
|---|---|
|
|
|
Berechnet |
|
(3) |
date1 == date2date1 != date2 |
Gleichheitsvergleich. (4) |
date1 < date2date1 > date2date1 <= date2date1 >= date2 |
Ordnungsvergleich. (5) |
Hinweise
date2 wird in die Zukunft verschoben, wenn
timedelta.days > 0, oder in die Vergangenheit, wenntimedelta.days < 0. Danach giltdate2 - date1 == timedelta.days.timedelta.secondsundtimedelta.microsecondswerden ignoriert.OverflowErrorwird ausgelöst, wenndate2.yearkleiner alsMINYEARoder größer alsMAXYEARwäre.timedelta.secondsundtimedelta.microsecondswerden ignoriert.Dies ist exakt und kann nicht überlaufen.
timedelta.secondsundtimedelta.microsecondssind 0, und danach giltdate2 + timedelta == date1.date-Objekte sind gleich, wenn sie dasselbe Datum darstellen.date-Objekte, die keinedatetime-Instanzen sind, sind niemals gleichdatetime-Objekten, selbst wenn sie dasselbe Datum darstellen.date1 wird als kleiner als date2 betrachtet, wenn date1 zeitlich vor date2 liegt. Anders ausgedrückt,
date1 < date2genau dann, wenndate1.toordinal() < date2.toordinal().Der Ordnungsvergleich zwischen einem
date-Objekt, das keinedatetime-Instanz ist, und einemdatetime-Objekt löstTypeErroraus.
Geändert in Version 3.13: Der Vergleich zwischen einem datetime-Objekt und einer Instanz der date-Unterklasse, die keine datetime-Unterklasse ist, konvertiert letztere nicht mehr zu date, wobei der Zeitteil und die Zeitzone ignoriert werden. Das Standardverhalten kann durch Überschreiben der speziellen Vergleichsmethoden in Unterklassen geändert werden.
In booleschen Kontexten werden alle date-Objekte als wahr betrachtet.
Instanzmethoden
- date.replace(year=self.year, month=self.month, day=self.day)¶
Gibt ein neues
date-Objekt mit denselben Werten zurück, jedoch mit aktualisierten angegebenen Parametern.Beispiel
>>> from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
Die generische Funktion
copy.replace()unterstützt auchdate-Objekte.
- date.timetuple()¶
Gibt ein
time.struct_timezurück, wie es vontime.localtime()zurückgegeben wird.Stunden, Minuten und Sekunden sind 0, und das DST-Flag ist -1.
d.timetuple()entsprichttime.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))
wobei
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1die Tagesnummer innerhalb des aktuellen Jahres ist, beginnend mit 1 für den 1. Januar.
- date.toordinal()¶
Gibt die proleptische gregorianische Ordinalzahl des Datums zurück, wobei der 1. Januar des Jahres 1 die Ordinalzahl 1 hat. Für jedes
date-Objektdgilt:date.fromordinal(d.toordinal()) == d.
- date.weekday()¶
Gibt den Wochentag als ganze Zahl zurück, wobei Montag 0 und Sonntag 6 ist. Zum Beispiel:
date(2002, 12, 4).weekday() == 2, ein Mittwoch. Siehe auchisoweekday().
- date.isoweekday()¶
Gibt den Wochentag als ganze Zahl zurück, wobei Montag 1 und Sonntag 7 ist. Zum Beispiel:
date(2002, 12, 4).isoweekday() == 3, ein Mittwoch. Siehe auchweekday(),isocalendar().
- date.isocalendar()¶
Gibt ein named tuple-Objekt mit drei Komponenten zurück:
year,weekundweekday.Der ISO-Kalender ist eine weit verbreitete Variante des gregorianischen Kalenders. [3]
Das ISO-Jahr besteht aus 52 oder 53 vollen Wochen, wobei eine Woche am Montag beginnt und am Sonntag endet. Die erste Woche eines ISO-Jahres ist die erste (gregorianische) Kalenderwoche eines Jahres, die einen Donnerstag enthält. Dies wird als Woche Nummer 1 bezeichnet, und das ISO-Jahr dieses Donnerstags ist dasselbe wie sein gregorianisches Jahr.
Zum Beispiel beginnt das Jahr 2004 an einem Donnerstag, daher beginnt die erste Woche des ISO-Jahres 2004 am Montag, dem 29. Dezember 2003 und endet am Sonntag, dem 4. Januar 2004.
>>> from datetime import date >>> date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
Geändert in Version 3.9: Das Ergebnis wurde von einem Tupel in ein named tuple geändert.
- date.isoformat()¶
Gibt eine Zeichenkette zurück, die das Datum im ISO 8601-Format darstellt:
YYYY-MM-DD>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04'
- date.__str__()¶
Für ein Datum
diststr(d)äquivalent zud.isoformat().
- date.ctime()¶
Gibt eine Zeichenkette zurück, die das Datum darstellt
>>> from datetime import date >>> date(2002, 12, 4).ctime() 'Wed Dec 4 00:00:00 2002'
d.ctime()entsprichttime.ctime(time.mktime(d.timetuple()))
auf Plattformen, auf denen die native C-Funktion
ctime()(die vontime.ctime()aufgerufen wird, aber nicht vondate.ctime()) dem C-Standard entspricht.
- date.strftime(format)¶
Gibt eine Zeichenkette zurück, die das Datum darstellt und durch eine explizite Formatzeichenkette gesteuert wird. Formatcodes, die sich auf Stunden, Minuten oder Sekunden beziehen, zeigen 0-Werte an. Siehe auch strftime() und strptime() Verhalten und
date.isoformat().
- date.__format__(format)¶
Identisch mit
date.strftime(). Dies ermöglicht die Angabe einer Formatzeichenkette für eindate-Objekt in formatierten Zeichenketten-Literalen und bei Verwendung vonstr.format(). Siehe auch strftime() und strptime() Verhalten unddate.isoformat().
Anwendungsbeispiele: date¶
Beispiel für die Berechnung von Tagen bis zu einem Ereignis
>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == date.fromtimestamp(time.time())
True
>>> my_birthday = date(today.year, 6, 24)
>>> if my_birthday < today:
... my_birthday = my_birthday.replace(year=today.year + 1)
...
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202
Weitere Beispiele für die Arbeit mit date
>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'
>>> # Methods for to extracting 'components' under different calendars
>>> t = d.timetuple()
>>> for i in t:
... print(i)
2002 # year
3 # month
11 # day
0
0
0
0 # weekday (0 = Monday)
70 # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
... print(i)
2002 # ISO year
11 # ISO week number
1 # ISO day number ( 1 = Monday )
>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
datetime Objekte¶
Ein datetime-Objekt ist ein einzelnes Objekt, das alle Informationen aus einem date-Objekt und einem time-Objekt enthält.
Wie ein date-Objekt nimmt datetime den aktuellen gregorianischen Kalender an, der in beide Richtungen erweitert ist; wie ein time-Objekt geht datetime davon aus, dass jeder Tag genau 3600*24 Sekunden hat.
Konstruktor
- class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
Die Argumente year, month und day sind erforderlich. tzinfo kann
Noneoder eine Instanz einer Unterklasse vontzinfosein. Die restlichen Argumente müssen ganze Zahlen in den folgenden Bereichen seinMINYEAR <= year <= MAXYEAR,1 <= month <= 12,1 <= day <= Anzahl der Tage im gegebenen Monat und Jahr,0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Wenn ein Argument außerhalb dieser Bereiche angegeben wird, wird
ValueErrorausgelöst.Geändert in Version 3.6: Parameter fold hinzugefügt.
Andere Konstruktoren, alle Klassenmethoden
- classmethod datetime.today()¶
Gibt das aktuelle lokale Datum und die aktuelle lokale Zeit zurück, mit
tzinfoNone.Entspricht
datetime.fromtimestamp(time.time())
Siehe auch
now(),fromtimestamp().Diese Methode ist funktional äquivalent zu
now(), aber ohne einentzParameter.
- classmethod datetime.now(tz=None)¶
Gibt das aktuelle lokale Datum und die aktuelle lokale Zeit zurück.
Wenn das optionale Argument tz
Noneist oder nicht angegeben wird, ist dies wietoday(), aber wenn möglich, wird eine höhere Präzision als durch eintime.time()Zeitstempel (zum Beispiel kann dies auf Plattformen möglich sein, die die Cgettimeofday()Funktion bereitstellen) geliefert.Wenn tz nicht
Noneist, muss es eine Instanz einer Unterklasse vontzinfosein, und das aktuelle Datum und die aktuelle Zeit werden in die Zeitzone von tz konvertiert.Diese Funktion wird gegenüber
today()undutcnow()bevorzugt.Hinweis
Nachfolgende Aufrufe von
datetime.now()können denselben Zeitpunkt zurückgeben, abhängig von der Präzision der zugrunde liegenden Uhr.
- classmethod datetime.utcnow()¶
Gibt das aktuelle UTC-Datum und die aktuelle UTC-Zeit zurück, mit
tzinfoNone.Dies ist wie
now(), gibt aber das aktuelle UTC-Datum und die aktuelle UTC-Zeit als naivesdatetimeObjekt zurück. Ein informatives aktuelles UTC-Datum und eine aktuelle UTC-Zeit können durch Aufrufen vondatetime.now(timezone.utc)erhalten werden. Siehe auchnow().Warnung
Da naive
datetimeObjekte von vielendatetimeMethoden als lokale Zeiten behandelt werden, ist es vorzuziehen, informative Datetime-Objekte zur Darstellung von Zeiten in UTC zu verwenden. Daher ist der empfohlene Weg, ein Objekt zu erstellen, das die aktuelle Zeit in UTC darstellt, durch Aufrufen vondatetime.now(timezone.utc).Veraltet seit Version 3.12: Verwenden Sie stattdessen
datetime.now()mitUTC.
- classmethod datetime.fromtimestamp(timestamp, tz=None)¶
Gibt das lokale Datum und die lokale Zeit zurück, die dem POSIX-Zeitstempel entsprechen, wie er von
time.time()zurückgegeben wird. Wenn das optionale Argument tzNoneist oder nicht angegeben wird, wird der Zeitstempel in das lokale Datum und die lokale Zeit der Plattform konvertiert, und das zurückgegebenedatetimeObjekt ist naiv.Wenn tz nicht
Noneist, muss es eine Instanz einer Unterklasse vontzinfosein, und der Zeitstempel wird in die Zeitzone von tz konvertiert.fromtimestamp()kannOverflowErrorauslösen, wenn der Zeitstempel außerhalb des Bereichs der von den plattformabhängigen Clocaltime()odergmtime()Funktionen unterstützten Werte liegt, undOSErrorbei einem Fehler vonlocaltime()odergmtime(). Häufig ist dies auf Jahre zwischen 1970 und 2038 beschränkt. Beachten Sie, dass auf Nicht-POSIX-Systemen, die Schaltsekunden in ihrer Zeitstempeldefinition enthalten, Schaltsekunden vonfromtimestamp()ignoriert werden und es dann möglich ist, zwei Zeitstempel zu haben, die sich um eine Sekunde unterscheiden und identischedatetimeObjekte ergeben. Diese Methode wird gegenüberutcfromtimestamp()bevorzugt.Geändert in Version 3.3: Löst
OverflowErroranstelle vonValueErroraus, wenn der Zeitstempel außerhalb des Bereichs der von den plattformabhängigen Clocaltime()odergmtime()Funktionen unterstützten Werte liegt. LöstOSErroranstelle vonValueErrorbei Fehler vonlocaltime()odergmtime()aus.Geändert in Version 3.6:
fromtimestamp()kann Instanzen mit gesetztem fold auf 1 zurückgeben.
- classmethod datetime.utcfromtimestamp(timestamp)¶
Gibt das UTC-
datetimezurück, das dem POSIX-Zeitstempel entspricht, mittzinfoNone. (Das resultierende Objekt ist naiv.)Dies kann
OverflowErrorauslösen, wenn der Zeitstempel außerhalb des Bereichs der von der plattformabhängigen Cgmtime()Funktion unterstützten Werte liegt, undOSErrorbei einem Fehler vongmtime(). Häufig ist dies auf Jahre zwischen 1970 und 2038 beschränkt.Um ein informatives
datetimeObjekt zu erhalten, rufen Siefromtimestamp()auf.datetime.fromtimestamp(timestamp, timezone.utc)
Auf POSIX-kompatiblen Plattformen ist dies äquivalent zum folgenden Ausdruck
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
mit Ausnahme, dass die letztere Formel immer den vollen Jahresbereich unterstützt: zwischen
MINYEARundMAXYEAReinschließlich.Warnung
Da naive
datetimeObjekte von vielendatetimeMethoden als lokale Zeiten behandelt werden, ist es vorzuziehen, informative Datetime-Objekte zur Darstellung von Zeiten in UTC zu verwenden. Daher ist der empfohlene Weg, ein Objekt zu erstellen, das einen bestimmten Zeitstempel in UTC darstellt, durch Aufrufen vondatetime.fromtimestamp(timestamp, tz=timezone.utc).Geändert in Version 3.3: Löst
OverflowErroranstelle vonValueErroraus, wenn der Zeitstempel außerhalb des Bereichs der von der plattformabhängigen Cgmtime()Funktion unterstützten Werte liegt. LöstOSErroranstelle vonValueErrorbei Fehler vongmtime()aus.Veraltet seit Version 3.12: Verwenden Sie stattdessen
datetime.fromtimestamp()mitUTC.
- classmethod datetime.fromordinal(ordinal)¶
Gibt das
datetimezurück, das dem proleptischen gregorianischen Ordinal entspricht, wobei der 1. Januar des Jahres 1 die Ordinalzahl 1 hat.ValueErrorwird ausgelöst, es sei denn,1 <= ordinal <= datetime.max.toordinal(). Stunde, Minute, Sekunde und Mikrosekunde des Ergebnisses sind alle 0, undtzinfoistNone.
- classmethod datetime.combine(date, time, tzinfo=time.tzinfo)¶
Gibt ein neues
datetimeObjekt zurück, dessen Datumskomponenten mit denen des angegebenendateObjekts übereinstimmen und dessen Zeitkomponenten mit denen des angegebenentimeObjekts übereinstimmen. Wenn das Argument tzinfo angegeben ist, wird sein Wert zum Setzen destzinfoAttributs des Ergebnisses verwendet, andernfalls wird dastzinfoAttribut des time Arguments verwendet. Wenn das date Argument eindatetimeObjekt ist, werden seine Zeitkomponenten undtzinfoAttribute ignoriert.Für jedes
datetimeObjektdgiltd == datetime.combine(d.date(), d.time(), d.tzinfo).Geändert in Version 3.6: Argument tzinfo hinzugefügt.
- classmethod datetime.fromisoformat(date_string)¶
Gibt ein
datetimezurück, das einer date_string in einem beliebigen gültigen ISO 8601-Format entspricht, mit folgenden AusnahmenZeitzonen-Offsets können Bruchteilsekunden enthalten.
Der Trenner
Tkann durch ein beliebiges einzelnes Unicode-Zeichen ersetzt werden.Gebrochene Stunden und Minuten werden nicht unterstützt.
Daten mit reduzierter Genauigkeit werden derzeit nicht unterstützt (
YYYY-MM,YYYY).Erweiterte Datumsdarstellungen werden derzeit nicht unterstützt (
±YYYYYY-MM-DD).Ordinaldatumsangaben werden derzeit nicht unterstützt (
YYYY-OOO).
Beispiele
>>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('20111104') datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-11-04T00:05:23Z') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
Hinzugefügt in Version 3.7.
Geändert in Version 3.11: Zuvor unterstützte diese Methode nur Formate, die von
date.isoformat()oderdatetime.isoformat()ausgegeben werden konnten.
- classmethod datetime.fromisocalendar(year, week, day)¶
Gibt ein
datetimezurück, das dem ISO-Kalenderdatum entspricht, das durch Jahr, Woche und Tag spezifiziert ist. Die Nicht-Datum-Komponenten des Datetime werden mit ihren normalen Standardwerten aufgefüllt. Dies ist die Umkehrung der Funktiondatetime.isocalendar().Hinzugefügt in Version 3.8.
- classmethod datetime.strptime(date_string, format)¶
Gibt ein
datetimezurück, das der date_string entspricht, geparst gemäß format.Wenn format keine Mikrosekunden oder Zeitzoneninformationen enthält, ist dies äquivalent zu
datetime(*(time.strptime(date_string, format)[0:6]))
ValueErrorwird ausgelöst, wenn die date_string und das Format nicht vontime.strptime()geparst werden können oder wenn ein Wert zurückgegeben wird, der kein Zeit-Tupel ist. Siehe auch strftime() und strptime() Verhalten unddatetime.fromisoformat().Geändert in Version 3.13: Wenn format einen Tag des Monats ohne Jahr angibt, wird nun eine
DeprecationWarningausgegeben. Dies dient zur Vermeidung eines vierjährigen Schaltjahresfehlers in Code, der nur einen Monat und Tag parsen möchte, da das Standardjahr bei Fehlen eines solchen im Format kein Schaltjahr ist. Solche format-Werte können ab Python 3.15 einen Fehler auslösen. Die Abhilfe besteht darin, immer ein Jahr in Ihrem format anzugeben. Wenn date_string-Werte ohne Jahr geparst werden, fügen Sie explizit ein Schaltjahr hinzu, bevor Sie parsen.>>> from datetime import datetime >>> date_string = "02/29" >>> when = datetime.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug. >>> when.strftime("%B %d") 'February 29'
Klassenattribute
- datetime.max¶
Das am spätesten darstellbare
datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
- datetime.resolution¶
Der kleinstmögliche Unterschied zwischen nicht-gleichen
datetimeObjekten,timedelta(microseconds=1).
Instanzattribute (schreibgeschützt)
- datetime.month¶
Zwischen 1 und 12 einschließlich.
- datetime.day¶
Zwischen 1 und der Anzahl der Tage im gegebenen Monat des gegebenen Jahres.
- datetime.hour¶
In
range(24).
- datetime.minute¶
In
range(60).
- datetime.second¶
In
range(60).
- datetime.microsecond¶
In
range(1000000).
- datetime.tzinfo¶
Das als Argument tzinfo an den
datetimeKonstruktor übergebene Objekt oderNone, wenn keines übergeben wurde.
- datetime.fold¶
In
[0, 1]. Wird verwendet, um Wandzeiten während eines wiederholten Intervalls zu disambiguieren. (Ein wiederholtes Intervall tritt auf, wenn Uhren am Ende der Sommerzeit zurückgestellt werden oder wenn der UTC-Offset für die aktuelle Zone aus politischen Gründen verringert wird.) Die Werte 0 und 1 repräsentieren jeweils den früheren und den späteren der beiden Momente mit der gleichen Wandzeitdarstellung.Hinzugefügt in Version 3.6.
Unterstützte Operationen
Operation |
Ergebnis |
|---|---|
|
(1) |
|
(2) |
|
(3) |
|
Gleichheitsvergleich. (4) |
|
Ordnungsvergleich. (5) |
datetime2 ist eine Dauer von timedelta, die von datetime1 abgezogen wird. Die Zeit bewegt sich vorwärts, wenn
timedelta.days > 0, oder rückwärts, wenntimedelta.days < 0. Das Ergebnis hat das gleichetzinfoAttribut wie das Eingabe-Datetime, unddatetime2 - datetime1 == timedeltadanach.OverflowErrorwird ausgelöst, wenndatetime2.yearkleiner alsMINYEARoder größer alsMAXYEARwäre. Beachten Sie, dass keine Zeitzonenanpassungen vorgenommen werden, auch wenn die Eingabe ein informatives Objekt ist.Berechnet das datetime2, so dass
datetime2 + timedelta == datetime1. Wie bei der Addition hat das Ergebnis das gleichetzinfoAttribut wie das Eingabe-Datetime, und es werden keine Zeitzonenanpassungen vorgenommen, auch wenn die Eingabe informativ ist.Die Subtraktion eines
datetimevon einemdatetimeist nur definiert, wenn beide Operanden naiv sind oder wenn beide informativ sind. Wenn einer informativ und der andere naiv ist, wirdTypeErrorausgelöst.Wenn beide naiv sind oder beide informativ und dasselbe
tzinfoAttribut haben, werden dietzinfoAttribute ignoriert, und das Ergebnis ist eintimedeltaObjektt, so dassdatetime2 + t == datetime1. In diesem Fall werden keine Zeitzonenanpassungen vorgenommen.Wenn beide informativ sind und unterschiedliche
tzinfoAttribute haben, verhält sicha-bso, als obaundbzuerst in naive UTC-Datetimes konvertiert worden wären. Das Ergebnis ist(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset()), außer dass die Implementierung niemals überläuft.datetimeObjekte sind gleich, wenn sie dasselbe Datum und dieselbe Uhrzeit darstellen, unter Berücksichtigung der Zeitzone.Naive und informative
datetimeObjekte sind niemals gleich.Wenn beide Vergleichswerte informativ sind und dasselbe
tzinfoAttribut haben, werden dietzinfoundfoldAttribute ignoriert und die Basis-Datetimes werden verglichen. Wenn beide Vergleichswerte informativ sind und unterschiedlichetzinfoAttribute haben, verhält sich der Vergleich so, als ob die Vergleichswerte zuerst in UTC-Datetimes konvertiert worden wären, außer dass die Implementierung niemals überläuft.datetimeInstanzen in einem wiederholten Intervall sind niemals gleichdatetimeInstanzen in einer anderen Zeitzone.datetime1 gilt als kleiner als datetime2, wenn datetime1 zeitlich vor datetime2 liegt, unter Berücksichtigung der Zeitzone.
Ordnungsvergleiche zwischen naiven und informativen
datetimeObjekten lösenTypeErroraus.Wenn beide Vergleichswerte Zeitzoneninformationen haben und denselben
tzinfo-Attributwert besitzen, werden dastzinfo- und dasfold-Attribut ignoriert und die Basis-Zeitpunkte werden verglichen. Wenn beide Vergleichswerte Zeitzoneninformationen haben und unterschiedlichetzinfo-Attribute besitzen, verhält sich der Vergleich so, als ob die Vergleichswerte zuerst in UTC-Zeitpunkte konvertiert würden, mit der Ausnahme, dass die Implementierung niemals überläuft.
Geändert in Version 3.3: Gleichheitsvergleiche zwischen Zeitpunkten mit und ohne Zeitzoneninformationen (aware und naive datetime-Instanzen) lösen keinen TypeError mehr aus.
Geändert in Version 3.13: Der Vergleich zwischen einem datetime-Objekt und einer Instanz der date-Unterklasse, die keine datetime-Unterklasse ist, konvertiert letztere nicht mehr zu date, wobei der Zeitteil und die Zeitzone ignoriert werden. Das Standardverhalten kann durch Überschreiben der speziellen Vergleichsmethoden in Unterklassen geändert werden.
Instanzmethoden
- datetime.time()¶
Gibt ein
time-Objekt mit derselben Stunde, Minute, Sekunde, Mikrosekunde und demselben Fold-Wert zurück.tzinfoistNone. Siehe auch Methodetimetz().Geändert in Version 3.6: Der Fold-Wert wird in das zurückgegebene
time-Objekt kopiert.
- datetime.timetz()¶
Gibt ein
time-Objekt mit derselben Stunde, Minute, Sekunde, Mikrosekunde, demselben Fold-Wert und demselben `tzinfo`-Attribut zurück. Siehe auch Methodetime().Geändert in Version 3.6: Der Fold-Wert wird in das zurückgegebene
time-Objekt kopiert.
- datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
Gibt ein neues
datetime-Objekt mit denselben Attributen zurück, aber mit den angegebenen Parametern aktualisiert. Beachten Sie, dasstzinfo=Noneangegeben werden kann, um einen naiven Zeitpunkt aus einem bewussten Zeitpunkt ohne Konvertierung von Datum und Zeitdaten zu erstellen.datetime-Objekte werden auch von der generischen Funktioncopy.replace()unterstützt.Geändert in Version 3.6: Parameter fold hinzugefügt.
- datetime.astimezone(tz=None)¶
Gibt ein
datetime-Objekt mit einem neuentzinfo-Attribut tz zurück und passt die Datums- und Zeitdaten so an, dass das Ergebnis dieselbe UTC-Zeit wie self ist, aber in der Lokalzeit von tz.Wenn angegeben, muss tz eine Instanz einer Unterklasse von
tzinfosein, und seine Methodenutcoffset()unddst()dürfen nichtNonezurückgeben. Wenn self naiv ist, wird angenommen, dass es die System-Lokalzeit darstellt.Wenn ohne Argumente aufgerufen (oder mit
tz=None), wird die System-Lokalzeit als Zielzeitzone angenommen. Das `.tzinfo`-Attribut der konvertierten Zeitpunkt-Instanz wird auf eine Instanz vontimezonemit dem von der OS erhaltenen Zeitzonennamen und Offset gesetzt.Wenn
self.tzinfogleich tz ist, istself.astimezone(tz)gleich self: Es wird keine Anpassung der Datums- oder Zeitdaten vorgenommen. Andernfalls ist das Ergebnis die Lokalzeit in der Zeitzone tz, die dieselbe UTC-Zeit wie self darstellt: Nachastz = dt.astimezone(tz)sindastz - astz.utcoffset()unddt - dt.utcoffset()gleich in Bezug auf Datum und Zeitdaten.Wenn Sie lediglich ein
timezone-Objekt tz an einen Zeitpunkt dt anhängen möchten, ohne die Datums- und Zeitdaten anzupassen, verwenden Siedt.replace(tzinfo=tz). Wenn Sie lediglich dastimezone-Objekt aus einem bewussten Zeitpunkt dt entfernen möchten, ohne die Datums- und Zeitdaten zu konvertieren, verwenden Siedt.replace(tzinfo=None).Beachten Sie, dass die Standardmethode
tzinfo.fromutc()in einer Unterklasse vontzinfoüberschrieben werden kann, um das vonastimezone()zurückgegebene Ergebnis zu beeinflussen. Fehlerfälle ignoriert, verhält sichastimezone()wiedef astimezone(self, tz): if self.tzinfo is tz: return self # Convert self to UTC, and attach the new timezone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc)
Geändert in Version 3.3: tz kann nun weggelassen werden.
Geändert in Version 3.6: Die Methode
astimezone()kann nun auch auf naive Instanzen angewendet werden, die die System-Lokalzeit repräsentieren.
- datetime.utcoffset()¶
Wenn
tzinfoNoneist, gibt diese MethodeNonezurück, andernfalls gibt sieself.tzinfo.utcoffset(self)zurück und löst eine Ausnahme aus, wenn letztere nichtNoneoder eintimedelta-Objekt mit einer Magnitude kleiner als ein Tag zurückgibt.Geändert in Version 3.7: Der UTC-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- datetime.dst()¶
Wenn
tzinfoNoneist, gibt diese MethodeNonezurück, andernfalls gibt sieself.tzinfo.dst(self)zurück und löst eine Ausnahme aus, wenn letztere nichtNoneoder eintimedelta-Objekt mit einer Magnitude kleiner als ein Tag zurückgibt.Geändert in Version 3.7: Der DST-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- datetime.tzname()¶
Wenn
tzinfoNoneist, gibt diese MethodeNonezurück, andernfalls gibt sieself.tzinfo.tzname(self)zurück und löst eine Ausnahme aus, wenn letztere nichtNoneoder ein String-Objekt zurückgibt.
- datetime.timetuple()¶
Gibt ein
time.struct_timezurück, wie es vontime.localtime()zurückgegeben wird.d.timetuple()entsprichttime.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))
wobei
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1der Tag des Jahres innerhalb des aktuellen Jahres ist, beginnend mit 1 für den 1. Januar. Das Flagtm_isdstdes Ergebnisses wird gemäß der Methodedst()gesetzt: WenntzinfoNoneist oderdst()Nonezurückgibt, wirdtm_isdstauf-1gesetzt; andernfalls, wenndst()einen von Null verschiedenen Wert zurückgibt, wirdtm_isdstauf 1 gesetzt; andernfalls wirdtm_isdstauf 0 gesetzt.
- datetime.utctimetuple()¶
Wenn die
datetime-Instanzdnaiv ist, entspricht diesd.timetuple(), mit der Ausnahme, dasstm_isdstunabhängig davon, wasd.dst()zurückgibt, auf 0 gesetzt wird. Sommerzeit ist niemals für eine UTC-Zeit aktiv.Wenn
dbewusst ist, wirddin UTC-Zeit normalisiert, indemd.utcoffset()subtrahiert wird, und eintime.struct_timefür die normalisierte Zeit zurückgegeben.tm_isdstwird auf 0 gesetzt. Beachten Sie, dass einOverflowErrorausgelöst werden kann, wennd.yearMINYEARoderMAXYEARwar und die UTC-Anpassung über eine Jahresgrenze hinausgeht.Warnung
Da naive
datetime-Objekte von vielendatetime-Methoden als lokale Zeiten behandelt werden, ist es vorzuziehen, bewusste Zeitpunkte zur Darstellung von Zeiten in UTC zu verwenden; folglich kann die Verwendung vondatetime.utctimetuple()irreführende Ergebnisse liefern. Wenn Sie ein naivesdatetimehaben, das UTC repräsentiert, verwenden Siedatetime.replace(tzinfo=timezone.utc), um es bewusst zu machen, wonach Siedatetime.timetuple()verwenden können.
- datetime.toordinal()¶
Gibt die proleptische gregorianische Ordinalzahl des Datums zurück. Dies ist dasselbe wie
self.date().toordinal().
- datetime.timestamp()¶
Gibt den POSIX-Zeitstempel zurück, der der
datetime-Instanz entspricht. Der Rückgabewert ist einfloat, ähnlich dem vontime.time()zurückgegebenen Wert.Naive
datetime-Instanzen werden als lokale Zeit angenommen und diese Methode stützt sich auf die plattformspezifische C-Funktionmktime()für die Konvertierung. Dadatetimeauf vielen Plattformen einen größeren Wertebereich unterstützt alsmktime(), kann diese Methode für Zeiten weit in der Vergangenheit oder ZukunftOverflowErroroderOSErrorauslösen.Für bewusste
datetime-Instanzen wird der Rückgabewert wie folgt berechnet:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Hinzugefügt in Version 3.3.
Geändert in Version 3.6: Die Methode
timestamp()verwendet das Attributfold, um Zeiten während eines wiederholten Intervalls zu disambiguieren.Hinweis
Es gibt keine Methode, um den POSIX-Zeitstempel direkt aus einer naiven
datetime-Instanz zu erhalten, die UTC-Zeit repräsentiert. Wenn Ihre Anwendung diese Konvention verwendet und Ihre Systemzeitzone nicht auf UTC eingestellt ist, können Sie den POSIX-Zeitstempel erhalten, indem Sietzinfo=timezone.utcangebentimestamp = dt.replace(tzinfo=timezone.utc).timestamp()
oder indem Sie den Zeitstempel direkt berechnen
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
- datetime.weekday()¶
Gibt den Wochentag als ganze Zahl zurück, wobei Montag 0 und Sonntag 6 ist. Dies ist dasselbe wie
self.date().weekday(). Siehe auchisoweekday().
- datetime.isoweekday()¶
Gibt den Wochentag als ganze Zahl zurück, wobei Montag 1 und Sonntag 7 ist. Dies ist dasselbe wie
self.date().isoweekday(). Siehe auchweekday(),isocalendar().
- datetime.isocalendar()¶
Gibt ein benanntes Tupel mit drei Komponenten zurück:
year,weekundweekday. Dies ist dasselbe wieself.date().isocalendar().
- datetime.isoformat(sep='T', timespec='auto')¶
Gibt einen String zurück, der das Datum und die Uhrzeit im ISO 8601-Format repräsentiert
YYYY-MM-DDTHH:MM:SS.ffffff, wennmicrosecondnicht 0 istYYYY-MM-DDTHH:MM:SS, wennmicrosecond0 ist
Wenn
utcoffset()nichtNonezurückgibt, wird ein String angehängt, der den UTC-Offset angibtYYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], wennmicrosecondnicht 0 istYYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]], wennmicrosecond0 ist
Beispiele
>>> from datetime import datetime, timezone >>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Das optionale Argument sep (Standard
'T') ist ein Ein-Zeichen-Separator, der zwischen dem Datums- und dem Uhrzeitanteil des Ergebnisses platziert wird. Zum Beispiel>>> from datetime import tzinfo, timedelta, datetime >>> class TZ(tzinfo): ... """A time zone with an arbitrary, constant -06:39 offset.""" ... def utcoffset(self, dt): ... return timedelta(hours=-6, minutes=-39) ... >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat() '2009-11-27T00:00:00.000100-06:39'
Das optionale Argument timespec gibt die Anzahl der zusätzlichen Zeitkomponenten an, die enthalten werden sollen (Standard ist
'auto'). Es kann einer der folgenden Werte sein:'auto': Dasselbe wie'seconds', wennmicrosecond0 ist, und dasselbe wie'microseconds', andernfalls.'hours': Schließt diehourim zweistelligenHH-Format ein.'seconds': Schließthour,minuteundsecondimHH:MM:SS-Format ein.'milliseconds': Schließt die vollständige Uhrzeit ein, schneidet aber den Bruchteil der Sekunde auf Millisekunden ab.HH:MM:SS.sss-Format.'microseconds': Schließt die vollständige Uhrzeit imHH:MM:SS.ffffff-Format ein.
Hinweis
Ausgeschlossene Zeitkomponenten werden abgeschnitten, nicht gerundet.
ValueErrorwird bei einem ungültigen timespec-Argument ausgelöst.>>> from datetime import datetime >>> datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0) >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Geändert in Version 3.6: Der Parameter timespec wurde hinzugefügt.
- datetime.ctime()¶
Gibt einen String zurück, der Datum und Uhrzeit repräsentiert
>>> from datetime import datetime >>> datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
Der Ausgabe-String enthält *keine* Zeitzoneninformationen, unabhängig davon, ob die Eingabe bewusst oder naiv ist.
d.ctime()entsprichttime.ctime(time.mktime(d.timetuple()))
auf Plattformen, auf denen die native C-Funktion
ctime()(dietime.ctime()aufruft,datetime.ctime()jedoch nicht) dem C-Standard entspricht.
- datetime.strftime(format)¶
Gibt einen String zurück, der Datum und Uhrzeit gemäß einer expliziten Formatzeichenkette repräsentiert. Siehe auch Verhalten von strftime() und strptime() und
datetime.isoformat().
- datetime.__format__(format)¶
Dasselbe wie
datetime.strftime(). Dies ermöglicht die Angabe einer Formatzeichenkette für eindatetime-Objekt in formatierten Zeichenketten-Literalen und bei Verwendung vonstr.format(). Siehe auch Verhalten von strftime() und strptime() unddatetime.isoformat().
Anwendungsbeispiele: datetime¶
Beispiele für die Arbeit mit datetime-Objekten
>>> from datetime import datetime, date, time, timezone
>>> # Using datetime.combine()
>>> d = date(2005, 7, 14)
>>> t = time(12, 30)
>>> datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> # Using datetime.now()
>>> datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> datetime.now(timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)
>>> # Using datetime.strptime()
>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> dt
datetime.datetime(2006, 11, 21, 16, 30)
>>> # Using datetime.timetuple() to get tuple of all attributes
>>> tt = dt.timetuple()
>>> for it in tt:
... print(it)
...
2006 # year
11 # month
21 # day
16 # hour
30 # minute
0 # second
1 # weekday (0 = Monday)
325 # number of days since 1st January
-1 # dst - method tzinfo.dst() returned None
>>> # Date in ISO format
>>> ic = dt.isocalendar()
>>> for it in ic:
... print(it)
...
2006 # ISO year
47 # ISO week
2 # ISO weekday
>>> # Formatting a datetime
>>> dt.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
Das folgende Beispiel definiert eine Unterklasse von tzinfo, die die Zeitzoneninformationen für Kabul, Afghanistan, erfasst, das bis 1945 +4 UTC und danach +4:30 UTC verwendete.
from datetime import timedelta, datetime, tzinfo, timezone
class KabulTz(tzinfo):
# Kabul used +4 until 1945, when they moved to +4:30
UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)
def utcoffset(self, dt):
if dt.year < 1945:
return timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):
# An ambiguous ("imaginary") half-hour range representing
# a 'fold' in time due to the shift from +4 to +4:30.
# If dt falls in the imaginary range, use fold to decide how
# to resolve. See PEP495.
return timedelta(hours=4, minutes=(30 if dt.fold else 0))
else:
return timedelta(hours=4, minutes=30)
def fromutc(self, dt):
# Follow same validations as in datetime.tzinfo
if not isinstance(dt, datetime):
raise TypeError("fromutc() requires a datetime argument")
if dt.tzinfo is not self:
raise ValueError("dt.tzinfo is not self")
# A custom implementation is required for fromutc as
# the input to this function is a datetime with utc values
# but with a tzinfo set to self.
# See datetime.astimezone or fromtimestamp.
if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:
return dt + timedelta(hours=4, minutes=30)
else:
return dt + timedelta(hours=4)
def dst(self, dt):
# Kabul does not observe daylight saving time.
return timedelta(0)
def tzname(self, dt):
if dt >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
Verwendung von KabulTz aus dem obigen Beispiel
>>> tz1 = KabulTz()
>>> # Datetime before the change
>>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00
>>> # Datetime after the change
>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00
>>> # Convert datetime to another time zone
>>> dt3 = dt2.astimezone(timezone.utc)
>>> dt3
datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
>>> dt2
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
>>> dt2 == dt3
True
time-Objekte¶
Ein time-Objekt repräsentiert eine (lokale) Tageszeit, unabhängig von einem bestimmten Datum und vorbehaltlich der Anpassung durch ein tzinfo-Objekt.
- class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
Alle Argumente sind optional. tzinfo kann
Noneoder eine Instanz einertzinfo-Unterklasse sein. Die restlichen Argumente müssen ganze Zahlen in den folgenden Bereichen sein:0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Wenn ein Argument außerhalb dieser Bereiche angegeben wird, wird
ValueErrorausgelöst. Alle Standardwerte sind 0, außer tzinfo, das aufNonegesetzt ist.
Klassenattribute
- time.resolution¶
Die kleinste mögliche Differenz zwischen ungleichen
time-Objekten,timedelta(microseconds=1), obwohl zu beachten ist, dass die Arithmetik mittime-Objekten nicht unterstützt wird.
Instanzattribute (schreibgeschützt)
- time.hour¶
In
range(24).
- time.minute¶
In
range(60).
- time.second¶
In
range(60).
- time.microsecond¶
In
range(1000000).
- time.tzinfo¶
Das als tzinfo-Argument an den
time-Konstruktor übergebene Objekt oderNone, wenn keines übergeben wurde.
- time.fold¶
In
[0, 1]. Wird verwendet, um Wandzeiten während eines wiederholten Intervalls zu disambiguieren. (Ein wiederholtes Intervall tritt auf, wenn Uhren am Ende der Sommerzeit zurückgestellt werden oder wenn der UTC-Offset für die aktuelle Zone aus politischen Gründen verringert wird.) Die Werte 0 und 1 repräsentieren jeweils den früheren und den späteren der beiden Momente mit der gleichen Wandzeitdarstellung.Hinzugefügt in Version 3.6.
time-Objekte unterstützen Gleichheits- und Ordnungsvergleiche, wobei a als kleiner als b betrachtet wird, wenn a zeitlich vor b liegt.
Naive und "aware" (zeitzoneninformierte) time-Objekte sind niemals gleich. Ordnungsvergleiche zwischen naiven und "aware" time-Objekten lösen TypeError aus.
Wenn beide Vergleichsoperanden "aware" sind und das gleiche tzinfo-Attribut haben, werden die tzinfo- und fold-Attribute ignoriert und die Basiszeiten verglichen. Wenn beide Vergleichsoperanden "aware" sind und unterschiedliche tzinfo-Attribute haben, werden die Vergleichsoperanden zuerst durch Subtraktion ihrer UTC-Offsets (erhalten von self.utcoffset()) angepasst.
Geändert in Version 3.3: Gleichheitsvergleiche zwischen "aware" und naiven time-Instanzen lösen keinen TypeError aus.
In booleschen Kontexten wird ein time-Objekt immer als wahr betrachtet.
Geändert in Version 3.5: Vor Python 3.5 wurde ein time-Objekt als falsch betrachtet, wenn es Mitternacht in UTC repräsentierte. Dieses Verhalten wurde als obskur und fehleranfällig angesehen und in Python 3.5 entfernt. Weitere Details finden Sie unter bpo-13936.
Andere Konstruktoren
- classmethod time.fromisoformat(time_string)¶
Gibt eine
timezurück, die einer time_string in jedem gültigen ISO 8601-Format entspricht, mit den folgenden Ausnahmen:Zeitzonen-Offsets können Bruchteilsekunden enthalten.
Das führende
T, das normalerweise in Fällen erforderlich ist, in denen es eine Mehrdeutigkeit zwischen Datum und Uhrzeit geben kann, ist nicht erforderlich.Bruchteile von Sekunden können eine beliebige Anzahl von Ziffern haben (alles über 6 wird abgeschnitten).
Gebrochene Stunden und Minuten werden nicht unterstützt.
Beispiele
>>> from datetime import time >>> time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('T04:23:01') datetime.time(4, 23, 1) >>> time.fromisoformat('T042301') datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01,000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) >>> time.fromisoformat('04:23:01Z') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) >>> time.fromisoformat('04:23:01+00:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
Hinzugefügt in Version 3.7.
Geändert in Version 3.11: Zuvor unterstützte diese Methode nur Formate, die von
time.isoformat()ausgegeben werden konnten.
- classmethod time.strptime(date_string, format)¶
Gibt eine
timezurück, die date_string entspricht, geparst gemäß format.Wenn format keine Mikrosekunden- oder Zeitzoneninformationen enthält, ist dies gleichbedeutend mit
time(*(time.strptime(date_string, format)[3:6]))
ValueErrorwird ausgelöst, wenn date_string und format nicht vontime.strptime()geparst werden können oder wenn es einen Wert zurückgibt, der kein Zeit-Tupel ist. Siehe auch Verhalten von strftime() und strptime() undtime.fromisoformat().Hinzugefügt in Version 3.14.
Instanzmethoden
- time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
Gibt ein neues
timemit den gleichen Werten zurück, aber mit angegebenen Parametern aktualisiert. Beachten Sie, dasstzinfo=Noneangegeben werden kann, um ein naivestimeaus einem "aware"timezu erstellen, ohne die Zeitdaten zu konvertieren.time-Objekte werden auch von der generischen Funktioncopy.replace()unterstützt.Geändert in Version 3.6: Parameter fold hinzugefügt.
- time.isoformat(timespec='auto')¶
Gibt eine Zeichenkette zurück, die die Uhrzeit im ISO 8601-Format darstellt, eine von
HH:MM:SS.ffffff, wennmicrosecondnicht 0 istHH:MM:SS, wennmicrosecond0 istHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], wennutcoffset()nichtNonezurückgibtHH:MM:SS+HH:MM[:SS[.ffffff]], wennmicrosecond0 ist undutcoffset()nichtNonezurückgibt
Das optionale Argument timespec gibt die Anzahl der zusätzlichen Zeitkomponenten an, die enthalten werden sollen (Standard ist
'auto'). Es kann einer der folgenden Werte sein:'auto': Wie'seconds', wennmicrosecond0 ist, wie'microseconds'sonst.'hours': Schließt diehourim zweistelligenHH-Format ein.'seconds': Schließthour,minuteundsecondimHH:MM:SS-Format ein.'milliseconds': Schließt die vollständige Uhrzeit ein, schneidet aber den Bruchteil der Sekunde auf Millisekunden ab.HH:MM:SS.sss-Format.'microseconds': Schließt die vollständige Uhrzeit imHH:MM:SS.ffffff-Format ein.
Hinweis
Ausgeschlossene Zeitkomponenten werden abgeschnitten, nicht gerundet.
ValueErrorwird bei einem ungültigen timespec-Argument ausgelöst.Beispiel
>>> from datetime import time >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> dt = time(hour=12, minute=34, second=56, microsecond=0) >>> dt.isoformat(timespec='microseconds') '12:34:56.000000' >>> dt.isoformat(timespec='auto') '12:34:56'
Geändert in Version 3.6: Der Parameter timespec wurde hinzugefügt.
- time.__str__()¶
Für eine Uhrzeit
tiststr(t)gleichbedeutend mitt.isoformat().
- time.strftime(format)¶
Gibt eine Zeichenkette zurück, die die Uhrzeit darstellt, gesteuert durch eine explizite Formatzeichenkette. Siehe auch Verhalten von strftime() und strptime() und
time.isoformat().
- time.__format__(format)¶
Wie
time.strftime(). Dies ermöglicht die Angabe einer Formatzeichenkette für eintime-Objekt in formatierten Zeichenketten-Literalen und bei Verwendung vonstr.format(). Siehe auch Verhalten von strftime() und strptime() undtime.isoformat().
- time.utcoffset()¶
Wenn
tzinfoNoneist, wirdNonezurückgegeben, andernfalls wirdself.tzinfo.utcoffset(None)zurückgegeben, und es wird eine Ausnahme ausgelöst, wenn letzteres nichtNoneoder eintimedelta-Objekt mit einer Magnitude kleiner als ein Tag zurückgibt.Geändert in Version 3.7: Der UTC-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- time.dst()¶
Wenn
tzinfoNoneist, wirdNonezurückgegeben, andernfalls wirdself.tzinfo.dst(None)zurückgegeben, und es wird eine Ausnahme ausgelöst, wenn letzteres nichtNoneoder eintimedelta-Objekt mit einer Magnitude kleiner als ein Tag zurückgibt.Geändert in Version 3.7: Der DST-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- time.tzname()¶
Wenn
tzinfoNoneist, wirdNonezurückgegeben, andernfalls wirdself.tzinfo.tzname(None)zurückgegeben, oder es wird eine Ausnahme ausgelöst, wenn letzteres nichtNoneoder ein String-Objekt zurückgibt.
Anwendungsbeispiele: time¶
Beispiele für die Arbeit mit einem time-Objekt
>>> from datetime import time, tzinfo, timedelta
>>> class TZ1(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=1)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self,dt):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'
tzinfo-Objekte¶
- class datetime.tzinfo¶
Dies ist eine abstrakte Basisklasse, was bedeutet, dass diese Klasse nicht direkt instanziiert werden sollte. Definieren Sie eine Unterklasse von
tzinfo, um Informationen über eine bestimmte Zeitzone zu erfassen.Eine Instanz von (einer konkreten Unterklasse von)
tzinfokann an die Konstruktoren fürdatetimeundtime-Objekte übergeben werden. Letztere Objekte betrachten ihre Attribute als in lokaler Zeit, und dastzinfo-Objekt unterstützt Methoden, die den Offset der Lokalzeit von UTC, den Namen der Zeitzone und den DST-Offset offenlegen, alles relativ zu einem Datum oder Zeitobjekt, das ihnen übergeben wird.Sie müssen eine konkrete Unterklasse ableiten und (zumindest) Implementierungen der Standardmethoden von
tzinfobereitstellen, die von den von Ihnen verwendetendatetime-Methoden benötigt werden. Das Moduldatetimestellttimezonebereit, eine einfache konkrete Unterklasse vontzinfo, die Zeitzonen mit festem Offset von UTC wie UTC selbst oder nordamerikanische EST und EDT darstellen kann.Spezielle Anforderung für das Pickling: Eine
tzinfo-Unterklasse muss eine__init__()-Methode haben, die ohne Argumente aufgerufen werden kann, andernfalls kann sie gepickelt, aber möglicherweise nicht wieder entpickelt werden. Dies ist eine technische Anforderung, die in Zukunft möglicherweise gelockert wird.Eine konkrete Unterklasse von
tzinfomuss möglicherweise die folgenden Methoden implementieren. Welche Methoden genau benötigt werden, hängt von der Verwendung von "aware" (zeitzoneninformierten)datetime-Objekten ab. Im Zweifelsfall implementieren Sie einfach alle.
- tzinfo.utcoffset(dt)¶
Gibt den Offset der Lokalzeit von UTC zurück, als
timedelta-Objekt, das östlich von UTC positiv ist. Wenn die Lokalzeit westlich von UTC liegt, sollte dies negativ sein.Dies repräsentiert den *Gesamt*-Offset von UTC; zum Beispiel, wenn ein
tzinfo-Objekt sowohl Zeitzonen- als auch DST-Anpassungen darstellt, sollteutcoffset()ihre Summe zurückgeben. Wenn der UTC-Offset nicht bekannt ist, geben SieNonezurück. Andernfalls muss der zurückgegebene Wert eintimedelta-Objekt sein, das streng zwischen-timedelta(hours=24)undtimedelta(hours=24)liegt (die Magnitude des Offsets muss kleiner als ein Tag sein). Die meisten Implementierungen vonutcoffset()werden wahrscheinlich wie eine der beiden folgenden aussehen:return CONSTANT # fixed-offset class return CONSTANT + self.dst(dt) # daylight-aware class
Wenn
utcoffset()nichtNonezurückgibt, solltedst()auch nichtNonezurückgeben.Die Standardimplementierung von
utcoffset()löstNotImplementedErroraus.Geändert in Version 3.7: Der UTC-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- tzinfo.dst(dt)¶
Gibt die Sommerzeit (DST)-Anpassung als
timedelta-Objekt oderNonezurück, wenn DST-Informationen nicht bekannt sind.Gibt
timedelta(0)zurück, wenn DST nicht in Kraft ist. Wenn DST in Kraft ist, geben Sie den Offset alstimedelta-Objekt zurück (sieheutcoffset()für Details). Beachten Sie, dass der DST-Offset, falls zutreffend, bereits zum UTC-Offset addiert wurde, der vonutcoffset()zurückgegeben wird. Daher mussdst()nicht konsultiert werden, es sei denn, Sie möchten DST-Informationen separat erhalten. Zum Beispiel ruftdatetime.timetuple()dastzinfo-Attribut desdatetime-Objekts auf, um zu bestimmen, wie das Flagtm_isdstgesetzt werden soll, undtzinfo.fromutc()ruftdst()auf, um DST-Änderungen beim Überqueren von Zeitzonen zu berücksichtigen.Eine Instanz tz einer
tzinfo-Unterklasse, die sowohl Standard- als auch Sommerzeiten modelliert, muss in diesem Sinne konsistent sein:tz.utcoffset(dt) - tz.dst(dt)muss für jedes
datetime-Objekt dt mitdt.tzinfo == tzdasselbe Ergebnis liefern. Für vernünftigetzinfo-Unterklassen ergibt dieser Ausdruck den "Standard-Offset" der Zeitzone, der nicht vom Datum oder der Uhrzeit abhängen sollte, sondern nur vom geografischen Standort. Die Implementierung vondatetime.astimezone()beruht darauf, kann aber keine Verstöße erkennen; es liegt in der Verantwortung des Programmierers, dies sicherzustellen. Wenn einetzinfo-Unterklasse dies nicht garantieren kann, kann sie möglicherweise die Standardimplementierung vontzinfo.fromutc()überschreiben, um trotzdem korrekt mitastimezone()zu arbeiten.Die meisten Implementierungen von
dst()werden wahrscheinlich wie eine der beiden folgenden aussehen:def dst(self, dt): # a fixed-offset class: doesn't account for DST return timedelta(0)
oder
def dst(self, dt): # Code to set dston and dstoff to the time zone's DST # transition times based on the input dt.year, and expressed # in standard local time. if dston <= dt.replace(tzinfo=None) < dstoff: return timedelta(hours=1) else: return timedelta(0)
Die Standardimplementierung von
dst()löstNotImplementedErroraus.Geändert in Version 3.7: Der DST-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- tzinfo.tzname(dt)¶
Gibt den Zeitzonennamen zurück, der dem
datetime-Objekt dt entspricht, als Zeichenkette. Nichts über Zeichenkettennamen ist vom Moduldatetimedefiniert, und es gibt keine Anforderung, dass es etwas Bestimmtes bedeutet. Zum Beispiel sind"GMT","UTC","-500","-5:00","EDT","US/Eastern","America/New York"alles gültige Antworten. Geben SieNonezurück, wenn ein Zeichenkettenname nicht bekannt ist. Beachten Sie, dass dies eine Methode und keine feste Zeichenkette ist, hauptsächlich weil einigetzinfo-Unterklassen je nach dem spezifischen Wert von dt, der übergeben wird, unterschiedliche Namen zurückgeben möchten, insbesondere wenn dietzinfo-Klasse die Sommerzeit berücksichtigt.Die Standardimplementierung von
tzname()löstNotImplementedErroraus.
Diese Methoden werden von einem datetime- oder time-Objekt aufgerufen, als Reaktion auf ihre gleichnamigen Methoden. Ein datetime-Objekt übergibt sich selbst als Argument, und ein time-Objekt übergibt None als Argument. Die Methoden einer tzinfo-Unterklasse sollten daher darauf vorbereitet sein, ein dt-Argument von None oder von der Klasse datetime zu akzeptieren.
Wenn None übergeben wird, obliegt es dem Klassendesigner zu entscheiden, wie am besten darauf zu reagieren ist. Zum Beispiel ist die Rückgabe von None angemessen, wenn die Klasse angeben möchte, dass Zeitobjekte nicht an den tzinfo-Protokollen teilnehmen. Es kann für utcoffset(None) nützlicher sein, den Standard-UTC-Offset zurückzugeben, da es keine andere Konvention gibt, um den Standard-Offset zu ermitteln.
Wenn ein datetime-Objekt als Antwort auf eine datetime-Methode übergeben wird, ist dt.tzinfo dasselbe Objekt wie self. tzinfo-Methoden können sich darauf verlassen, es sei denn, Benutzercode ruft tzinfo-Methoden direkt auf. Die Absicht ist, dass die tzinfo-Methoden dt als lokale Zeit interpretieren und sich keine Sorgen um Objekte in anderen Zeitzonen machen müssen.
Es gibt noch eine weitere tzinfo-Methode, die eine Unterklasse möglicherweise überschreiben möchte
- tzinfo.fromutc(dt)¶
Diese wird von der Standardimplementierung von
datetime.astimezone()aufgerufen. Wenn von dort aufgerufen, istdt.tzinfoself, und die Datums- und Zeitdaten von dt sind als UTC-Zeit anzusehen. Der Zweck vonfromutc()ist es, die Datums- und Zeitdaten anzupassen und ein äquivalentes Datum und eine äquivalente Zeit in der lokalen Zeit von self zurückzugeben.Die meisten
tzinfo-Unterklassen sollten in der Lage sein, die Standardimplementierung vonfromutc()ohne Probleme zu erben. Sie ist stark genug, um Zeitzonen mit festem Offset zu verarbeiten, sowie Zeitzonen, die sowohl die Standard- als auch die Sommerzeit berücksichtigen, und letztere auch dann, wenn sich die Sommerzeit-Übergangszeiten in verschiedenen Jahren unterscheiden. Ein Beispiel für eine Zeitzone, die die Standardimplementierung vonfromutc()möglicherweise nicht in allen Fällen korrekt behandelt, ist eine, bei der der Standard-Offset (von UTC) vom spezifischen übergebenen Datum und der übergebenen Zeit abhängt, was aus politischen Gründen vorkommen kann. Die Standardimplementierungen vonastimezone()undfromutc()liefern möglicherweise nicht das gewünschte Ergebnis, wenn das Ergebnis eine der Stunden ist, die den Moment des Wandels des Standard-Offsets umspannen.Unter Auslassung von Code für Fehlerfälle verhält sich die Standardimplementierung von
fromutc()wiedef fromutc(self, dt): # raise ValueError error if dt.tzinfo is not self dtoff = dt.utcoffset() dtdst = dt.dst() # raise ValueError if dtoff is None or dtdst is None delta = dtoff - dtdst # this is self's standard offset if delta: dt += delta # convert to standard local time dtdst = dt.dst() # raise ValueError if dtdst is None if dtdst: return dt + dtdst else: return dt
In der folgenden Datei tzinfo_examples.py finden Sie einige Beispiele für tzinfo-Klassen
from datetime import tzinfo, timedelta, datetime
ZERO = timedelta(0)
HOUR = timedelta(hours=1)
SECOND = timedelta(seconds=1)
# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
# timezones where UTC offset and/or the DST rules had
# changed in the past.)
import time as _time
STDOFFSET = timedelta(seconds = -_time.timezone)
if _time.daylight:
DSTOFFSET = timedelta(seconds = -_time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(tzinfo):
def fromutc(self, dt):
assert dt.tzinfo is self
stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND
args = _time.localtime(stamp)[:6]
dst_diff = DSTDIFF // SECOND
# Detect fold
fold = (args == _time.localtime(stamp - dst_diff))
return datetime(*args, microsecond=dt.microsecond,
tzinfo=self, fold=fold)
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return DSTDIFF
else:
return ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, 0)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
# A complete implementation of current DST rules for major US time zones.
def first_sunday_on_or_after(dt):
days_to_go = 6 - dt.weekday()
if days_to_go:
dt += timedelta(days_to_go)
return dt
# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for US
# DST start and end times. For a complete and up-to-date set of DST rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = datetime(1, 4, 1, 2)
DSTEND_1987_2006 = datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006
def us_dst_range(year):
# Find start and end times for US DST. For years before 1967, return
# start = end for no DST.
if 2006 < year:
dststart, dstend = DSTSTART_2007, DSTEND_2007
elif 1986 < year < 2007:
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
elif 1966 < year < 1987:
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
else:
return (datetime(year, 1, 1), ) * 2
start = first_sunday_on_or_after(dststart.replace(year=year))
end = first_sunday_on_or_after(dstend.replace(year=year))
return start, end
class USTimeZone(tzinfo):
def __init__(self, hours, reprname, stdname, dstname):
self.stdoffset = timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname
def __repr__(self):
return self.reprname
def tzname(self, dt):
if self.dst(dt):
return self.dstname
else:
return self.stdname
def utcoffset(self, dt):
return self.stdoffset + self.dst(dt)
def dst(self, dt):
if dt is None or dt.tzinfo is None:
# An exception may be sensible here, in one or both cases.
# It depends on how you want to treat them. The default
# fromutc() implementation (called by the default astimezone()
# implementation) passes a datetime with dt.tzinfo is self.
return ZERO
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
# Can't compare naive to aware objects, so strip the timezone from
# dt first.
dt = dt.replace(tzinfo=None)
if start + HOUR <= dt < end - HOUR:
# DST is in effect.
return HOUR
if end - HOUR <= dt < end:
# Fold (an ambiguous hour): use dt.fold to disambiguate.
return ZERO if dt.fold else HOUR
if start <= dt < start + HOUR:
# Gap (a non-existent hour): reverse the fold rule.
return HOUR if dt.fold else ZERO
# DST is off.
return ZERO
def fromutc(self, dt):
assert dt.tzinfo is self
start, end = us_dst_range(dt.year)
start = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = dt + self.stdoffset
dst_time = std_time + HOUR
if end <= dst_time < end + HOUR:
# Repeated hour
return std_time.replace(fold=1)
if std_time < start or dst_time >= end:
# Standard time
return std_time
if start <= std_time < end - HOUR:
# Daylight saving time
return dst_time
Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
Central = USTimeZone(-6, "Central", "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
Beachten Sie, dass es zweimal im Jahr in einer tzinfo-Unterklasse, die sowohl die Standard- als auch die Sommerzeit berücksichtigt, zu unvermeidlichen Feinheiten kommt, und zwar zu den Sommerzeit-Übergangspunkten. Konkret betrachten wir Eastern US (UTC -0500), wo die EDT am Minute nach 1:59 (EST) am zweiten Sonntag im März beginnt und am Minute nach 1:59 (EDT) am ersten Sonntag im November endet
UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM
EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM
EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM
start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM
end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM
Wenn die Sommerzeit beginnt (die "Start"-Zeile), springt die lokale Wanduhr von 1:59 auf 3:00. Eine Wandzeit der Form 2:MM ist an diesem Tag nicht wirklich sinnvoll, daher liefert astimezone(Eastern) an dem Tag, an dem die Sommerzeit beginnt, kein Ergebnis mit hour == 2. Zum Beispiel erhalten wir beim Übergang im Frühjahr 2016
>>> from datetime import datetime, timezone
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname())
...
05:00:00 UTC = 00:00:00 EST
06:00:00 UTC = 01:00:00 EST
07:00:00 UTC = 03:00:00 EDT
08:00:00 UTC = 04:00:00 EDT
Wenn die Sommerzeit endet (die "End"-Zeile), gibt es ein potenziell schlimmeres Problem: Es gibt eine Stunde, die in lokaler Wandzeit nicht eindeutig ausgedrückt werden kann: die letzte Stunde der Sommerzeit. In Eastern sind das Zeiten der Form 5:MM UTC an dem Tag, an dem die Sommerzeit endet. Die lokale Wanduhr springt von 1:59 (Sommerzeit) zurück auf 1:00 (Standardzeit). Lokale Zeiten der Form 1:MM sind mehrdeutig. astimezone() ahmt das Verhalten der lokalen Uhr nach, indem es zwei aufeinanderfolgende UTC-Stunden in dieselbe lokale Stunde abbildet. Im Eastern-Beispiel werden UTC-Zeiten der Form 5:MM und 6:MM bei der Umwandlung nach Eastern beide auf 1:MM abgebildet, aber frühere Zeiten haben das Attribut fold auf 0 gesetzt und spätere Zeiten haben es auf 1 gesetzt. Zum Beispiel erhalten wir beim Übergang im Herbst 2016
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
Beachten Sie, dass die datetime-Instanzen, die sich nur durch den Wert des fold-Attributs unterscheiden, bei Vergleichen als gleich betrachtet werden.
Anwendungen, die Wandzeit-Mehrdeutigkeiten nicht ertragen können, sollten explizit den Wert des fold-Attributs prüfen oder die Verwendung von hybriden tzinfo-Unterklassen vermeiden; es gibt keine Mehrdeutigkeiten bei der Verwendung von timezone oder einer anderen tzinfo-Unterklasse mit festem Offset (wie z. B. einer Klasse, die nur EST (fester Offset -5 Stunden) oder nur EDT (fester Offset -4 Stunden) repräsentiert).
Siehe auch
zoneinfoDas Modul
datetimehat eine einfachetimezone-Klasse (zur Behandlung beliebiger fester Offsets von UTC) und ihr Attributtimezone.utc(eine UTCtimezone-Instanz).
zoneinfobringt die *IANA Time Zone Database* (auch bekannt als Olson-Datenbank) nach Python, und ihre Verwendung wird empfohlen.
- IANA Time Zone Database
Die Time Zone Database (oft tz, tzdata oder zoneinfo genannt) enthält Code und Daten, die die Geschichte der lokalen Zeit für viele repräsentative Orte auf der ganzen Welt darstellen. Sie wird periodisch aktualisiert, um Änderungen von politischen Gremien an Zeitzonengrenzen, UTC-Offsets und Regeln für die Sommerzeit widerzuspiegeln.
timezone-Objekte¶
Die Klasse timezone ist eine Unterklasse von tzinfo, von der jede Instanz eine Zeitzone repräsentiert, die durch einen festen Offset von UTC definiert ist.
Objekte dieser Klasse können nicht verwendet werden, um Zeitzoneninformationen für Orte darzustellen, an denen zu verschiedenen Zeiten des Jahres unterschiedliche Offsets verwendet werden oder an denen historische Änderungen an der Zivilzeit vorgenommen wurden.
- class datetime.timezone(offset, name=None)¶
Das Argument offset muss als
timedelta-Objekt angegeben werden, das die Differenz zwischen der lokalen Zeit und UTC darstellt. Es muss streng zwischen-timedelta(hours=24)undtimedelta(hours=24)liegen, andernfalls wirdValueErrorausgelöst.Das Argument name ist optional. Wenn es angegeben ist, muss es eine Zeichenkette sein, die als Wert verwendet wird, der von der Methode
datetime.tzname()zurückgegeben wird.Hinzugefügt in Version 3.2.
Geändert in Version 3.7: Der UTC-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- timezone.utcoffset(dt)¶
Gibt den festen Wert zurück, der beim Erstellen der
timezone-Instanz angegeben wurde.Das Argument dt wird ignoriert. Der Rückgabewert ist eine
timedelta-Instanz, die der Differenz zwischen der lokalen Zeit und UTC entspricht.Geändert in Version 3.7: Der UTC-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
- timezone.tzname(dt)¶
Gibt den festen Wert zurück, der beim Erstellen der
timezone-Instanz angegeben wurde.Wenn name im Konstruktor nicht angegeben wurde, wird der Name, der von
tzname(dt)zurückgegeben wird, aus dem Wert desoffsetgeneriert. Wenn offsettimedelta(0)ist, ist der Name "UTC", andernfalls ist es eine Zeichenkette im FormatUTC±HH:MM, wobei ± das Vorzeichen vonoffsetist, HH und MM zwei Ziffern vonoffset.hoursundoffset.minutessind.Geändert in Version 3.6: Der aus
offset=timedelta(0)generierte Name ist jetzt schlicht'UTC'und nicht'UTC+00:00'.
- timezone.dst(dt)¶
Gibt immer
Nonezurück.
- timezone.fromutc(dt)¶
Gibt
dt + offsetzurück. Das Argument dt muss eine bewusstedatetime-Instanz sein, mittzinfoaufselfgesetzt.
Klassenattribute
- timezone.utc¶
Die UTC-Zeitzone,
timezone(timedelta(0)).
strftime()- und strptime()-Verhalten¶
date-, datetime- und time-Objekte unterstützen alle eine Methode strftime(format), um eine Zeit unter der Kontrolle eines expliziten Formatstrings zu erzeugen.
Umgekehrt erstellen die Klassenmethoden date.strptime(), datetime.strptime() und time.strptime() ein Objekt aus einem String, der die Zeit darstellt, und einem entsprechenden Formatstring.
Die folgende Tabelle bietet einen Vergleich von strftime() und strptime()
|
|
|
|---|---|---|
Verwendung |
Objekt nach einem gegebenen Format in eine Zeichenkette umwandeln |
Eine Zeichenkette anhand eines entsprechenden Formats in ein Objekt parsen |
Typ der Methode |
Instanzmethode |
Klassenmethode |
Signatur |
|
|
Formatcodes für strftime() und strptime()¶
Diese Methoden akzeptieren Formatcodes, die zum Parsen und Formatieren von Daten verwendet werden können
>>> datetime.strptime('31/01/22 23:59:59.999999',
... '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'
Die folgende Liste enthält alle Formatcodes, die der C89-Standard vorschreibt und die auf allen Plattformen mit einer Standard-C-Implementierung funktionieren.
Direktive |
Bedeutung |
Beispiel |
Hinweise |
|---|---|---|---|
|
Wochentag als abgekürzter Name der Locale. |
Son, Mon, …, Sat (en_US);
So, Mo, …, Sa (de_DE)
|
(1) |
|
Wochentag als vollständiger Name der Locale. |
Sunday, Monday, …, Saturday (en_US);
Sonntag, Montag, …, Samstag (de_DE)
|
(1) |
|
Wochentag als Dezimalzahl, wobei 0 Sonntag und 6 Samstag ist. |
0, 1, …, 6 |
|
|
Tag des Monats als null-aufgefüllte Dezimalzahl. |
01, 02, …, 31 |
(9) |
|
Monat als abgekürzter Name der Locale. |
Jan, Feb, …, Dez (en_US);
Jan, Feb, …, Dez (de_DE)
|
(1) |
|
Monat als vollständiger Name der Locale. |
January, February, …, December (en_US);
Januar, Februar, …, Dezember (de_DE)
|
(1) |
|
Monat als null-aufgefüllte Dezimalzahl. |
01, 02, …, 12 |
(9) |
|
Jahr ohne Jahrhundert als null-aufgefüllte Dezimalzahl. |
00, 01, …, 99 |
(9) |
|
Jahr mit Jahrhundert als Dezimalzahl. |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(2) |
|
Stunde (24-Stunden-Format) als null-aufgefüllte Dezimalzahl. |
00, 01, …, 23 |
(9) |
|
Stunde (12-Stunden-Format) als null-aufgefüllte Dezimalzahl. |
01, 02, …, 12 |
(9) |
|
Locale-entsprechende Bezeichnung für AM oder PM. |
AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
|
Minute als null-aufgefüllte Dezimalzahl. |
00, 01, …, 59 |
(9) |
|
Sekunde als null-aufgefüllte Dezimalzahl. |
00, 01, …, 59 |
(4), (9) |
|
Mikrosekunde als Dezimalzahl, 6-stellig null-aufgefüllt. |
000000, 000001, …, 999999 |
(5) |
|
UTC-Offset im Format |
(leer), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
Zeitzonenname (leere Zeichenkette, wenn das Objekt naiv ist). |
(leer), UTC, GMT |
(6) |
|
Tag des Jahres als null-aufgefüllte Dezimalzahl. |
001, 002, …, 366 |
(9) |
|
Wochennummer des Jahres (Sonntag als erster Tag der Woche) als null-aufgefüllte Dezimalzahl. Alle Tage in einem neuen Jahr vor dem ersten Sonntag werden der Woche 0 zugeordnet. |
00, 01, …, 53 |
(7), (9) |
|
Wochennummer des Jahres (Montag als erster Tag der Woche) als null-aufgefüllte Dezimalzahl. Alle Tage in einem neuen Jahr vor dem ersten Montag werden der Woche 0 zugeordnet. |
00, 01, …, 53 |
(7), (9) |
|
Locale-entsprechende Datums- und Zeitdarstellung. |
Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)
|
(1) |
|
Locale-entsprechende Datumsdarstellung. |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
Locale-entsprechende Zeitdarstellung. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
Ein literales ' |
% |
Mehrere zusätzliche Direktiven, die nicht vom C89-Standard gefordert werden, sind zur Bequemlichkeit enthalten. Diese Parameter entsprechen alle ISO 8601-Datumsangaben.
Direktive |
Bedeutung |
Beispiel |
Hinweise |
|---|---|---|---|
|
ISO 8601-Jahr mit Jahrhundert, das das Jahr repräsentiert, das den größten Teil der ISO-Woche ( |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(8) |
|
ISO 8601-Wochentag als Dezimalzahl, wobei 1 Montag ist. |
1, 2, …, 7 |
|
|
ISO 8601-Woche als Dezimalzahl mit Montag als erstem Tag der Woche. Woche 01 ist die Woche, die den 4. Januar enthält. |
01, 02, …, 53 |
(8), (9) |
|
UTC-Offset im Format |
(leer), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216 |
(6) |
Diese sind möglicherweise nicht auf allen Plattformen verfügbar, wenn sie mit der Methode strftime() verwendet werden. Die Direktiven für ISO 8601-Jahr und ISO 8601-Woche sind nicht austauschbar mit den oben genannten Direktiven für Jahr und Wochennummer. Das Aufrufen von strptime() mit unvollständigen oder mehrdeutigen ISO 8601-Direktiven löst einen ValueError aus.
Der vollständige Satz von unterstützten Formatcodes variiert je nach Plattform, da Python die strftime()-Funktion der C-Bibliothek der Plattform aufruft und plattformabhängige Abweichungen üblich sind. Um den vollständigen Satz von auf Ihrer Plattform unterstützten Formatcodes zu sehen, konsultieren Sie die Dokumentation von strftime(3). Es gibt auch Unterschiede zwischen Plattformen bei der Behandlung nicht unterstützter Formatbezeichner.
Hinzugefügt in Version 3.6: %G, %u und %V wurden hinzugefügt.
Hinzugefügt in Version 3.12: %:z wurde hinzugefügt.
Technische Details¶
Im Allgemeinen verhält sich d.strftime(fmt) ähnlich wie die Methode time.strftime(fmt, d.timetuple()) des Moduls time, obwohl nicht alle Objekte eine timetuple()-Methode unterstützen.
Für die Klassenmethode datetime.strptime() ist der Standardwert 1900-01-01T00:00:00.000: Alle Komponenten, die im Formatstring nicht angegeben sind, werden aus dem Standardwert übernommen. [4]
Die Verwendung von datetime.strptime(date_string, format) ist äquivalent zu
datetime(*(time.strptime(date_string, format)[0:6]))
außer wenn das Format Sub-Sekunden-Komponenten oder Zeitzonen-Offset-Informationen enthält, die in datetime.strptime unterstützt werden, aber von time.strptime verworfen werden.
Für time-Objekte sollten die Formatcodes für Jahr, Monat und Tag nicht verwendet werden, da time-Objekte keine solchen Werte haben. Wenn sie dennoch verwendet werden, werden 1900 für das Jahr und 1 für Monat und Tag eingesetzt.
Für date-Objekte sollten die Formatcodes für Stunden, Minuten, Sekunden und Mikrosekunden nicht verwendet werden, da date-Objekte keine solchen Werte haben. Wenn sie dennoch verwendet werden, werden diese mit 0 substituiert.
Aus demselben Grund ist die Handhabung von Formatstrings, die Unicode-Codepunkte enthalten, die nicht in der Zeichenkodierung der aktuellen Locale dargestellt werden können, ebenfalls plattformabhängig. Auf einigen Plattformen werden solche Codepunkte intakt in der Ausgabe beibehalten, während auf anderen strftime UnicodeError auslösen oder eine leere Zeichenkette zurückgeben kann.
Hinweise
Da das Format von der aktuellen Locale abhängt, ist Vorsicht geboten, wenn Annahmen über den Ausgabewert getroffen werden. Die Reihenfolge der Felder variiert (z. B. "Monat/Tag/Jahr" gegenüber "Tag/Monat/Jahr"), und die Ausgabe kann Nicht-ASCII-Zeichen enthalten.
Die Methode
strptime()kann Jahre im vollen Bereich [1, 9999] parsen, aber Jahre < 1000 müssen auf 4 Ziffern null-aufgefüllt werden.Geändert in Version 3.2: In früheren Versionen war die Methode
strftime()auf Jahre >= 1900 beschränkt.Geändert in Version 3.3: In Version 3.2 war die Methode
strftime()auf Jahre >= 1000 beschränkt.Bei Verwendung mit der Methode
strptime()beeinflusst die Direktive%pnur das Ausgabestundenfeld, wenn die Direktive%Izur Interpretation der Stunde verwendet wird.Im Gegensatz zum Modul
timeunterstützt das Moduldatetimekeine Schaltsekunden.Bei Verwendung mit der Methode
strptime()akzeptiert die Direktive%fein bis sechs Ziffern und füllt mit Nullen auf der rechten Seite auf.%fist eine Erweiterung des Satzes von Formatzeichen im C-Standard (aber separat in datetime-Objekten implementiert und daher immer verfügbar).Für ein naives Objekt werden die Formatcodes
%z,%:zund%Zdurch leere Zeichenketten ersetzt.Für ein bewusstes Objekt
%zutcoffset()wird in eine Zeichenkette der Form±HHMM[SS[.ffffff]]umgewandelt, wobeiHHeine 2-stellige Zeichenkette für die Anzahl der UTC-Offset-Stunden,MMeine 2-stellige Zeichenkette für die Anzahl der UTC-Offset-Minuten,SSeine 2-stellige Zeichenkette für die Anzahl der UTC-Offset-Sekunden undffffffeine 6-stellige Zeichenkette für die Anzahl der UTC-Offset-Mikrosekunden ist. Der Teilffffffwird weggelassen, wenn der Offset eine ganze Anzahl von Sekunden ist, und sowohl der Teilffffffals auch der TeilSSwerden weggelassen, wenn der Offset eine ganze Anzahl von Minuten ist. Wennutcoffset()beispielsweisetimedelta(hours=-3, minutes=-30)zurückgibt, wird%zdurch die Zeichenkette'-0330'ersetzt.
Geändert in Version 3.7: Der UTC-Offset ist nicht mehr auf eine ganze Anzahl von Minuten beschränkt.
Geändert in Version 3.7: Wenn die Direktive
%zder Methodestrptime()übergeben wird, können die UTC-Offsets einen Doppelpunkt als Trennzeichen zwischen Stunden, Minuten und Sekunden haben. Zum Beispiel wird'+01:00:00'als Offset von einer Stunde geparst. Außerdem ist die Angabe von'Z'identisch mit'+00:00'.%:zVerhält sich genau wie
%z, fügt aber einen Doppelpunkt als Trennzeichen zwischen Stunden, Minuten und Sekunden hinzu.%ZIn
strftime()wird%Zdurch eine leere Zeichenkette ersetzt, wenntzname()Nonezurückgibt; andernfalls wird%Zdurch den zurückgegebenen Wert ersetzt, der eine Zeichenkette sein muss.strptime()akzeptiert nur bestimmte Werte für%Zjeder Wert in
time.tznamefür die Locale Ihres Rechnersdie hartcodierten Werte
UTCundGMT
Jemand, der in Japan lebt, hat möglicherweise
JST,UTCundGMTals gültige Werte, aber wahrscheinlich nichtEST. Für ungültige Werte wirdValueErrorausgelöst.
Geändert in Version 3.2: Wenn die
%zDirektive an diestrptime()Methode übergeben wird, wird ein bewusstesdatetimeObjekt erzeugt. Dertzinfodes Ergebnisses wird auf einetimezoneInstanz gesetzt.Bei Verwendung mit der
strptime()Methode werden%Uund%Wnur in Berechnungen verwendet, wenn der Wochentag und das Kalenderjahr (%Y) angegeben sind.Ähnlich wie
%Uund%Wwird%Vnur in Berechnungen verwendet, wenn der Wochentag und das ISO-Jahr (%G) in einemstrptime()Formatstring angegeben sind. Beachten Sie auch, dass%Gund%Ynicht austauschbar sind.Bei Verwendung mit der
strptime()Methode ist die führende Null für die Formate%d,%m,%H,%I,%M,%S,%j,%U,%Wund%Voptional. Format%yerfordert eine führende Null.Beim Parsen eines Monats und Tages mit
strptime(), geben Sie immer ein Jahr im Format an. Wenn der zu parsende Wert kein Jahr hat, fügen Sie ein explizites Dummy-Schaltjahr hinzu. Andernfalls wird Ihr Code eine Ausnahme auslösen, wenn er auf den Schalttag trifft, da das vom Parser verwendete Standardjahr kein Schaltjahr ist. Benutzer stoßen alle vier Jahre auf diesen Fehler...>>> month_day = "02/29" >>> datetime.strptime(f"{month_day};1984", "%m/%d;%Y") # No leap year bug. datetime.datetime(1984, 2, 29, 0, 0)
Veraltet seit Version 3.13, wird in Version 3.15 entfernt:
strptime()Aufrufe mit einem Formatstring, der einen Tag des Monats ohne Jahr enthält, lösen jetzt eineDeprecationWarningaus. In 3.15 oder später können wir dies in einen Fehler ändern oder das Standardjahr in ein Schaltjahr ändern. Siehe gh-70647.
Fußnoten