datetime — Βασικοί τύποι ημερομηνίας και ώρας¶
Πηγαίος κώδικας: Lib/datetime.py
Το module datetime παρέχει κλάσεις για την επεξεργασία ημερομηνιών και ωρών.
Ενώ υποστηρίζεται η αριθμητική ημερομηνίας και ώρας, η υλοποίηση εστιάζει στην αποδοτική εξαγωγή χαρακτηριστικών για τη μορφοποίηση και τον χειρισμό της εξόδου.
Πρακτική συμβουλή
Μετάβαση στους κωδικούς μορφοποίησης.
Δείτε επίσης
- Module
calendar Γενικές συναρτήσεις που σχετίζονται με το ημερολόγιο.
- Module
time Πρόσβαση και μετατροπές χρόνου.
- Module
zoneinfo Συγκεκριμένες ζώνες ώρας που αντιπροσωπεύουν τη βάση δεδομένων ζωνών ώρας IANA.
- Πακέτο dateutil
Βιβλιοθήκη τρίτου μέρους με επεκτείνουσα υποστήριξη ζωνών ώρας και ανάλυσης.
- Πακέτο DateType
Third-party library that introduces distinct static types to for example, allow static type checkers to differentiate between naive and aware datetimes.
Aware and naive objects¶
Τα αντικείμενα ημερομηνίας και ώρας μπορούν να κατηγοριοποιηθούν ως «ενήμερα» ή «αδαή» ανάλογα με το αν περιλαμβάνουν ή όχι πληροφορίες ζώνης ώρας.
Με επαρκή γνώση των εφαρμοστέων αλγοριθμικών και πολιτικών ρυθμίσεων χρόνου, όπως πληροφορίες ζώνης ώρας και θερινής ώρας, ένα ενήμερο αντικείμενο μπορεί να εντοπίσει τη θέση του σε σχέση με άλλα ενήμερα αντικείμενα. Ένα ενήμερο αντικείμενο αντιπροσωπεύει μια συγκεκριμένη στιγμή στο χρόνο που δεν υπόκειται σε ερμηνεία. [1]
Ένα αδαές αντικείμενο δεν περιέχει αρκετές πληροφορίες για να εντοπίσει με σαφήνεια τον εαυτό του σε σχέση με άλλα αντικείμενα ημερομηνίας/ώρας. Το αν ένα αδαές αντικείμενο αντιπροσωπεύει Συντονισμένη Παγκόσμια Ώρα (UTC), τοπική ώρα, ή ώρα σε κάποια άλλη ζώνη ώρας εξαρτάται αποκλειστικά από το πρόγραμμα, όπως ακριβώς εξαρτάται από το πρόγραμμα εάν ένας συγκεκριμένος αριθμός αντιπροσωπεύει μέτρα, μίλια ή μάζα. Τα αδαή αντικείμενα είναι εύκολο να κατανοηθούν και να χρησιμοποιηθούν, με κόστος την αγνόηση ορισμένων πτυχών της πραγματικότητας.
For applications requiring aware objects, datetime and time
objects have an optional time zone information attribute, tzinfo, that
can be set to an instance of a subclass of the abstract tzinfo class.
These tzinfo objects capture information about the offset from UTC
time, the time zone name, and whether daylight saving time is in effect.
Μόνο μία συγκεκριμένη κλάση tzinfo, η κλάση timezone, παρέχεται από το datetime module. Η κλάση timezone μπορεί να αντιπροσωπεύει απλές ζώνες ώρας με σταθερές αποκλίσεις από την UTC, όπως η ίδια η UTC ή οι ζώνες ώρας EST και EDT της Βόρειας Αμερικής. Η υποστήριξη ζωνών ώρας σε βαθύτερα επίπεδα λεπτομέρειας είναι ευθύνη της εφαρμογής. Οι κανόνες για την προσαρμογή του χρόνου σε όλο τον κόσμο είναι περισσότερο πολιτικοί παρά λογικοί, αλλάζουν συχνά και δεν υπάρχει πρότυπο κατάλληλο για κάθε εφαρμογή εκτός από την UTC.
Σταθερές¶
Το datetime module εξάγει τις παρακάτω σταθερές:
- datetime.MINYEAR¶
Ο μικρότερος αριθμός έτους που επιτρέπεται σε ένα αντικείμενο
dateήdatetime. ΤοMINYEARείναι 1.
- datetime.MAXYEAR¶
Ο μεγαλύτερος αριθμός έτους που επιτρέπεται σε ένα αντικείμενο
dateήdatetime. ΤοMAXYEARείναι 9999.
- datetime.UTC¶
Ψευδώνυμο για το μοναδικό αντικείμενο ζώνης ώρας UTC
datetime.timezone.utc.Added in version 3.11.
Available types¶
- class datetime.date
Μια ιδανική αδαής ημερομηνία, υποθέτοντας ότι το τρέχον Γρηγοριανό ημερολόγιο ήταν πάντα σε ισχύ και θα είναι πάντα σε ισχύ. Χαρακτηριστικά:
year,monthκαιday.
- class datetime.time
Μια ιδανική ώρα, ανεξάρτητη από οποιαδήποτε συγκεκριμένη ημέρα, υποθέτοντας ότι κάθε ημέρα έχει ακριβώς 24*60*60 δευτερόλεπτα. (Δεν υπάρχει έννοια «δευτερόλεπτα διακοπής» εδώ.) Χαρακτηριστικά:
hour,minute,second,microsecond, καιtzinfo.
- class datetime.datetime
Μια συνδυασμένη ημερομηνία και ώρα. Χαρακτηριστικά:
year,month,day,hour,minute,second,microsecond, καιtzinfo.
- class datetime.timedelta
Μια διάρκεια που εκφράζει τη διαφορά μεταξύ δύο στιγμιοτύπων
datetimeήdateμε ακρίβεια μικροδευτερολέπτου.
- class datetime.tzinfo
Μια αφηρημένη κλάση βάσης για αντικείμενα πληροφοριών ζώνης ώρας. Αυτά χρησιμοποιούνται από τις κλάσεις
datetimeκαιtimeγια να παρέχουν μια προσαρμόσιμη έννοια προσαρμογής χρόνου (για παράδειγμα, για να ληφθούν υπόψη η ζώνη ώρας και/ή η θερινή ώρα).
- class datetime.timezone
Μια κλάση που υλοποιεί την αφηρημένη κλάση βάσης
tzinfoως μια σταθερή απόκλιση από την UTC.Added in version 3.2.
Αντικείμενα αυτών των τύπων είναι αμετάβλητα.
Subclass relationships:
Common properties¶
Οι date, datetime, time και timezone τύποι έχουν κάποια κοινά χαρακτηριστικά:
Determining if an object is aware or naive¶
Αντικείμενα της κλάσης date είναι πάντα αδαή.
Ένα αντικείμενο της time ή datetime μπορεί να είναι ενήμερο ή αδαές.
Ένα αντικείμενα της κλάσης datetime d είναι ενήμερο αν ισχύουν και τα δύο παρακάτω:
το
d.tzinfoδεν είναιNoneτο
d.tzinfo.utcoffset(d)δεν επιστρέφειNone
Διαφορετικά, το d είναι αδαές.
Ένα αντικείμενο time t είναι ενήμερο αν ισχύουν και τα δύο παρακάτω:
το
t.tzinfoδεν είναιNoneτο
t.tzinfo.utcoffset(None)δεν επιστρέφειNone.
Διαφορετικά, το t είναι αδαές.
Ο διαχωρισμός μεταξύ ενήμερων και αδαών δεν ισχύει για τα αντικείμενα timedelta.
timedelta objects¶
Ένα αντικείμενο timedelta αντιπροσωπεύει μια διάρκεια, τη διαφορά μεταξύ δύο στιγμιοτύπων datetime ή date.
- class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶
Όλα τα ορίσματα είναι προαιρετικά και με προεπιλογή 0. Τα ορίσματα μπορεί να είναι ακέραιοι ή αριθμοί κινητής υποδιαστολής, και μπορεί να είναι θετικά ή αρνητικά.
Μόνο τα days, seconds και microseconds αποθηκεύονται εσωτερικά. Τα ορίσματα μετατρέπονται σε αυτές τις μονάδες:
Ένα χιλιοστό του δευτερολέπτου μετατρέπεται σε 1000 μικροδευτερόλεπτα.
Ένα λεπτό μετατρέπεται σε 60 δευτερόλεπτα.
Μια ώρα μετατρέπεται σε 3600 δευτερόλεπτα.
Μια εβδομάδα μετατρέπεται σε 7 ημέρες.
και οι ημέρες, τα δευτερόλεπτα και τα μικροδευτερόλεπτα κανονικοποιούνται ώστε η αναπαράσταση να είναι μοναδική με
0 <= microseconds < 10000000 <= seconds < 3600*24(ο αριθμός των δευτερολέπτων σε μια μέρα)-999999999 <= days <= 999999999
Το παρακάτω παράδειγμα δείχνει πώς οποιαδήποτε ορίσματα εκτός από τα days, seconds και microseconds «συγχωνεύονται» και κανονικοποιούνται σε αυτά τα τρία τελικά γνωρίσματα:
>>> import datetime as dt >>> delta = dt.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)
Πρακτική συμβουλή
import datetime as dtinstead ofimport datetimeorfrom datetime import datetimeto avoid confusion between the module and the class. See How I Import Python’s datetime Module.Εάν κάποιο από τα ορίσματα είναι αριθμός κινητής υποδιαστολής και υπάρχουν δεκαδικά μικροδευτερόλεπτα, τα δεκαδικά μικροδευτερόλεπτα που απομένουν από όλα τα ορίσματα συνδυάζονται και το άθροισμά τους στρογγυλοποιείται στο πλησιέστερο μικροδευτερόλεπτο χρησιμοποιώντας τον κανόνα σπασίματος ισοπαλίας (round-half-to-even). Εάν κανένα από τα ορίσματα δεν είναι αριθμός κινητής υποδιαστολής, οι πράξεις μετατροπής και κανονικοποίησης είναι ακριβείς (δεν χάνεται πληροφορία).
Εάν η κανονικοποιημένη τιμή των ημερών βρίσκεται εκτός του καθορισμένου εύρους, γίνεται raise η
OverflowError.Σημειώστε ότι η κανονικοποίηση των αρνητικών τιμών μπορεί να είναι απροσδόκητη στην αρχή. Για παράδειγμα:
>>> import datetime as dt >>> d = dt.timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)
Δεδομένου ότι η συμβολοσειρά αναπαράστασης των αντικειμένων
timedeltaμπορεί να είναι μπερδευτική, χρησιμοποιήστε την παρακάτω συνταγή για να παραγάγετε μια πιο αναγνώσιμη μορφή:>>> 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)'
Χαρακτηριστικά Κλάσης:
- timedelta.max¶
Το πιο θετικό αντικείμενο της
timedelta,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).
- timedelta.resolution¶
Η μικρότερη δυνατή διαφορά μεταξύ μη ίσων αντικειμένων
timedelta,timedelta(microseconds=1).
Σημειώστε ότι, λόγω της κανονικοποίησης, το timedelta.max``είναι μεγαλύτερο από το ``-timedelta.min. Το -timedelta.max δεν μπορεί να αναπαρασταθεί ως ένα αντικείμενο timedelta.
Χαρακτηριστικά στιγμιοτύπου (μόνο για ανάγνωση):
- timedelta.days¶
Μεταξύ -999,999,999 και 999,999,999 συμπεριλαμβανομένου.
- timedelta.seconds¶
Μεταξύ 0 και 86,399 συμπεριλαμβανομένου.
Προσοχή
Είναι ένα σχετικά συνηθισμένο σφάλμα ο κώδικας να χρησιμοποιεί κατά λάθος αυτό το χαρακτηριστικό, όταν στην πραγματικότητα προορίζεται να πάρει την τιμή της
total_seconds():>>> import datetime as dt >>> duration = dt.timedelta(seconds=11235813) >>> duration.days, duration.seconds (130, 3813) >>> duration.total_seconds() 11235813.0
- timedelta.microseconds¶
Μεταξύ 0 και 999,999 συμπεριλαμβανομένου.
Υποστηριζόμενες πράξεις:
Πράξη |
Αποτέλεσμα |
|---|---|
|
Το άθροισμα των |
|
Η διαφορά του |
|
Πολλαπλασιασμός του διαστήματος με έναν ακέραιο. Στη συνέχεια το |
Γενικά, το |
|
|
Πολλαπλασιασμός του διαστήματος με έναν αριθμό κινητής υποδιαστολής. Το αποτέλεσμα στρογγυλοποιείται στο πλησιέστερο πολλαπλάσιο της timedelta.resolution χρησιμοποιώντας τον κανόνα σπασίματος ισοπαλίας «round-half-to-even». |
|
Διαίρεση (3) της συνολικής διάρκειας |
|
Διαίρεση του διαστήματος με έναν αριθμό κινητής υποδιαστολής ή έναν ακέραιο. Το αποτέλεσμα θα στρογγυλοποιηθεί στο πλησιέστερο πολλαπλάσιο της timedelta.resolution χρησιμοποιώντας τον κανόνα σπασίματος ισοπαλίας «round-half-to-even». |
|
Η ακέραια διαίρεση υπολογίζεται και το υπόλοιπο (εάν υπάρχει) παραλείπεται. Στην δεύτερη περίπτωση, ένα ακέραιος επιστρέφεται. (3) |
|
Το υπόλοιπο υπολογίζεται ως ένα |
|
Υπολογίζει το πηλίκο και το υπόλοιπο: |
|
Επιστρέφει ένα |
|
Ισοδύναμο με |
|
Ισοδύναμο με |
|
Επιστρέφει μια συμβολοσειρά στη μορφή |
|
Επιστρέφει μια συμβολοσειρά αναπαράστασης του |
Σημειώσεις:
Αυτό είναι ακριβές αλλά μπορεί να υπερχειλίσει.
Αυτό είναι ακριβές και δεν μπορεί να υπερχειλίσει.
Η διαίρεση με το μηδέν κάνει raise
ZeroDivisionError.Το
-timedelta.maxδεν μπορεί να αναπαρασταθεί ως έναtimedeltaαντικείμενο.Οι αναπαραστάσεις συμβολοσειράς
timedeltaαντικειμένων είναι κανονικοποιημένες παρόμοια με την εσωτερική τους αναπαράσταση. Αυτό οδηγεί κάπως σε ασυνήθη αποτελέσματα για αρνητικά timedeltas. Για παράδειγμα:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
Η έκφραση
t2 - t3θα είναι συνέχεια ίση με την έκφρασηt2 + (-t3)εκτός όταν το t3 είναι ίσο μεtimedelta.max∙ σε αυτή τη περίπτωση το πρώτο θα παράγει ένα αποτέλεσμα ενώ το δεύτερο θα υπερχειλίσει.
Εκτός από τις παραπάνω λειτουργίες, τα αντικείμενα timedelta υποστηρίζουν ορισμένες προσθέσεις και αφαιρέσεις με αντικείμενα date και datetime (δείτε παρακάτω).
Άλλαξε στην έκδοση 3.2: Floor division and true division of a timedelta object by another
timedelta object are now supported, as are remainder operations and
the divmod() function. True division and multiplication of a
timedelta object by a float object are now supported.
Τα αντικείμενα timedelta υποστηρίζουν συγκρίσεις ισότητας και διάταξης.
Σε Boolean συμφραζόμενα, ένα αντικείμενο timedelta θεωρείται αληθές μόνο αν δεν είναι ίσο με timedelta(0).
Μέθοδοι στιγμιοτύπου:
- timedelta.total_seconds()¶
Return the total number of seconds contained in the duration. Equivalent to
td / timedelta(seconds=1). For interval units other than seconds, use the division form directly (for example,td / timedelta(microseconds=1)).Σημειώστε ότι για πολύ μεγάλα χρονικά διαστήματα (πάνω από 270 χρόνια στις περισσότερες πλατφόρμες) αυτή η μέθοδος θα χάσει ακρίβεια στα microseconds.
Added in version 3.2.
Examples of usage: timedelta¶
Ένα επιπλέον παράδειγμα κανονικοποίησης:
>>> # Components of another_year add up to exactly 365 days
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> another_year = dt.timedelta(weeks=40, days=84, hours=23,
... minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
Παραδείγματα αριθμητικών πράξεων με timedelta:
>>> import datetime as dt
>>> year = dt.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 objects¶
Ένα αντικείμενο date αναπαριστά μια ημερομηνία (έτος, μήνα και ημέρα) σε ένα ιδεατό ημερολόγιο, το τρέχον Γρηγοριανό ημερολόγιο επεκτεταμένο επ” αόριστον και προς τις δύο κατευθύνσεις.
Η 1η Ιανουαρίου του 1ου έτους ονομάζεται ημέρα 1, η 2α Ιανουαρίου του 1ου έτους ονομάζεται ημέρα 2, και ούτω καθεξής. [2]
- class datetime.date(year, month, day)¶
Όλα τα ορίσματα είναι υποχρεωτικά. Τα ορίσματα πρέπει να είναι ακέραιοι αριθμοί, στα παρακάτω εύρη:
MINYEAR <= year <= MAXYEAR1 <= month <= 121 <= day <= number of days in the given month and year
Εάν ένα όρισμα εκτός αυτών των ευρών δοθεί, γίνεται raise
ValueError.
Άλλοι κατασκευαστές, όλες οι μέθοδοι της κλάσης:
- classmethod date.today()¶
Επιστρέφει την τρέχουσα τοπική ημερομηνία.
Αυτό είναι ισοδύναμο με
date.fromtimestamp(time.time()).
- classmethod date.fromtimestamp(timestamp)¶
Return the local date corresponding to the POSIX timestamp, such as is returned by
time.time().Αυτό μπορεί να κάνει raise
OverflowError, εάν το timestamp είναι εκτός του εύρους τιμών που υποστηρίζει η συνάρτησηlocaltime()της πλατφόρμας C, καθώς καιOSErrorσε περίπτωση αποτυχίας τηςlocaltime(). Είναι κοινό αυτό να περιορίζεται σε έτη από το 1970 έως το 2038. Σημειώστε ότι σε μη POSIX συστήματα που περιλαμβάνουν δευτερόλεπτα διαλείμματος στην έννοια τους για ένα timestamp, τα δευτερόλεπτα διαλείμματος αγνοούνται από τηνfromtimestamp().Άλλαξε στην έκδοση 3.3: Κάνει raise
OverflowErrorαντί γιαValueErrorεάν το timestamp είναι εκτός του εύρους τιμών που υποστηρίζει η συνάρτησηlocaltime()της πλατφόρμας C. Κάνει raiseOSErrorαντί γιαValueErrorσε περίπτωση αποτυχίας τηςlocaltime().
- classmethod date.fromordinal(ordinal)¶
Return the date corresponding to the proleptic Gregorian ordinal, where January 1 of year 1 has ordinal 1.
Γίνεται raise η
ValueErrorεκτός εάν1 <= ordinal <= date.max.toordinal(). Για οποιαδήποτε ημέραd,date.fromordinal(d.toordinal()) == d.
- classmethod date.fromisoformat(date_string)¶
Επιστρέφει ένα αντικείμενο
dateπου αντιστοιχεί σε ένα date_string δοσμένο σε οποιαδήποτε έγκυρη μορφή ISO 8601, με τις εξής εξαιρέσεις:Οι ημερομηνίες μειωμένης ακρίβειας δεν υποστηρίζονται προς το παρόν (
YYYY-MM,YYYY).Οι εκτεταμένες αναπαραστάσεις ημερομηνίας δεν υποστηρίζονται προς το παρόν (
±YYYYYY-MM-DD).Οι διατακτικές ημερομηνίες δεν υποστηρίζονται προς το παρόν (
YYYY-OOO).
Παραδείγματα:
>>> import datetime as dt >>> dt.date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) >>> dt.date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> dt.date.fromisoformat('2021-W01-1') datetime.date(2021, 1, 4)
Added in version 3.7.
Άλλαξε στην έκδοση 3.11: Προηγουμένως, αυτή η μέθοδος υποστήριζε μόνο τη μορφή
YYYY-MM-DD.
- classmethod date.fromisocalendar(year, week, day)¶
Return a
datecorresponding to the ISO calendar date specified by year, week and day. This is the inverse of the functiondate.isocalendar().Added in version 3.8.
- classmethod date.strptime(date_string, format)¶
Επιστρέφει ένα αντικείμενο
dateπου αντιστοιχεί σε date_string, αναλυμένο σύμφωνα με το format. Αυτό είναι ισοδύναμο με:date(*(time.strptime(date_string, format)[0:3]))
Η
ValueErrorγίνεται raise εάν το date_string και το format δεν μπορούν να αναλυθούν από τηνtime.strptime()ή εάν επιστρέφει μια τιμή που δεν είναι τουλάχιστον μια πλειάδα χρόνου. Δείτε επίσης τα strftime() and strptime() behavior καιdate.fromisoformat().Σημείωση
Εάν το format καθορίζει μια ημέρα του μήνα χωρίς έτος, μια
DeprecationWarningπροκύπτει. Αυτό γίνεται για να αποφευχθεί ένα σφάλμα τετραετούς δίσεκτου έτους στον κώδικα που προσπαθεί να αναλύσει μόνο έναν μήνα και μια ημέρα, καθώς το προεπιλεγμένο έτος που χρησιμοποιείται σε περίπτωση απουσίας του στη μορφή δεν είναι δίσεκτο έτος. Τέτοιες τιμές format μπορεί να προκαλέσουν σφάλμα από την έκδοση 3.15 της Python και μετά. Η λύση είναι να συμπεριλαμβάνετε πάντα ένα έτος στη μορφή σας. Εάν αναλύετε τιμές date_string που δεν έχουν έτος, προσθέστε ρητά ένα έτος που είναι δίσεκτο πριν από την ανάλυση:>>> import datetime as dt >>> date_string = "02/29" >>> when = dt.date.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug. >>> when.strftime("%B %d") 'February 29'
Added in version 3.14.
Χαρακτηριστικά Κλάσης:
- date.min¶
Το νωρίτερο αναπαραστάσιμο έτος,
date(MINYEAR, 1, 1).
- date.max¶
Το πιο πρόσφατο αναπαραστάσιμο έτος,
date(MAXYEAR, 12, 31).
- date.resolution¶
Η μικρότερη δυνατή διαφορά μεταξύ μη-ίσων αντικειμένων ημέρας,
timedelta(days=1).
Χαρακτηριστικά στιγμιοτύπου (μόνο για ανάγνωση):
- date.month¶
Μεταξύ 1 και 12 συμπεριλαμβανομένων.
- date.day¶
Μεταξύ 1 και του αριθμού των ημερών στον δεδομένο μήνα του δεδομένου έτους.
Υποστηριζόμενες πράξεις:
Πράξη |
Αποτέλεσμα |
|---|---|
|
Το |
|
Υπολογίζει το |
|
(3) |
date1 == date2date1 != date2 |
Σύγκριση ισότητας. (4) |
date1 < date2date1 > date2date1 <= date2date1 >= date2 |
Σύγκριση σειράς. (5) |
Σημειώσεις:
Το date2 μετακινείται προς τα εμπρός στο χρόνο εάν
timedelta.days > 0, ή προς τα πίσω εάνtimedelta.days < 0. Έπειταdate2 - date1 == timedelta.days. Ταtimedelta.secondsκαιtimedelta.microsecondsαγνοούνται. ΗOverflowErrorγίνεται raise εάν τοdate2.yearθα ήταν μικρότερο απόMINYEARή μεγαλύτερο απόMAXYEAR.τα
timedelta.secondsκαιtimedelta.microsecondsαγνοούνται.Αυτό είναι ακριβές και δεν μπορεί να υπερχειλίσει. Τα
timedelta.secondsκαιtimedelta.microsecondsείναι 0, καιdate2 + timedelta == date1μετά.Τα
dateαντικείμενα είναι ίσα εάν αναπαριστούν την ίδια ημερομηνία.Τα
dateαντικείμενα που δεν είναι επίσηςdatetimeστιγμιότυπα δεν είναι ποτέ ίσα μεdatetimeαντικείμενα, ακόμη και αν αναπαριστούν την ίδια ημερομηνία.Το date1 θεωρείται μικρότερο από το date2 όταν το date1 προηγείται του date2 στο χρόνο. Με άλλα λόγια,
date1 < date2αν και μόνο ανdate1.toordinal() < date2.toordinal().Order comparison between a
dateobject that is not also adatetimeinstance and adatetimeobject raisesTypeError.
Άλλαξε στην έκδοση 3.13: Η σύγκριση μεταξύ ενός αντικειμένου datetime και ενός στιγμιοτύπου της υποκλάσης date που δεν είναι υποκλάση του datetime δεν μετατρέπει πλέον το τελευταίο σε date, αγνοώντας το μέρος χρόνου και τη ζώνη ώρας. Η προεπιλεγμένη συμπεριφορά μπορεί να αλλάξει με την υπερκάλυψη των ειδικών μεθόδων σύγκρισης σε υποκλάσεις.
Στα Boolean περιεχόμενα, όλα τα αντικείμενα date θεωρούνται αληθή.
Μέθοδοι στιγμιοτύπου:
- date.replace(year=self.year, month=self.month, day=self.day)¶
Επιστρέφει ένα νέο αντικείμενο της
dateμε τις ίδιες τιμές, αλλά με ενημερωμένες παραμέτρους.Παράδειγμα:
>>> import datetime as dt >>> d = dt.date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
Η γενική συνάρτηση
copy.replace()υποστηρίζει επίσης ταdateαντικείμενα.
- date.timetuple()¶
Επιστρέφει μια
time.struct_timeόπως επιστρέφεται από τηνtime.localtime().Οι ώρες, τα λεπτά και τα δευτερόλεπτα είναι 0, και το DST flag είναι -1.
Το
d.timetuple()είναι ισοδύναμο με:time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))
όπου
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1είναι ο αριθμός της ημέρας εντός του τρέχοντος έτους ξεκινώντας από 1 για την 1η Ιανουαρίου.
- date.toordinal()¶
Επιστρέφει το προληπτικό Γρηγοριανό αριθμό της ημερομηνίας, όπου η 1η Ιανουαρίου του 1ου έτους έχει αριθμό 1. Για οποιοδήποτε αντικείμενο
dated,date.fromordinal(d.toordinal()) == d.
- date.weekday()¶
Επιστρέφει την ημέρα του έτους ως έναν ακέραιο, όπου η Δευτέρα είναι 0 και η Κυριακή είναι 6. Για παράδειγμα,
date(2002, 12, 4).weekday() == 2, ως Τετάρτη. Δείτε επίσηςisoweekday().
- date.isoweekday()¶
Επιστρέφει την ημέρα της εβδομάδα ως έναν ακέραιο, όπου η Δευτέρα είναι 1 και η Κυριακή είναι 7. Για παράδειγμα,
date(2002, 12, 4).isoweekday() == 3, μια Τετάρτη. Δείτε επίσηςweekday(),isocalendar().
- date.isocalendar()¶
Επιστρέφει ένα αντικείμενο named tuple με τρία στοιχεία
year,weekκαιweekday.Το ημερολόγιο ISO είναι μια ευρέως χρησιμοποιούμενη εκδοχή τους Γρηγοριανού ημερολογίου. [3]
Το ISO έτος αποτελείται από 52 ή 53 πλήρες εβδομάδες, όπου μια εβδομάδα ξεκινάει από την ημέρα Δευτέρα και τελειώνει με την ημέρα Κυριακή. Η πρώτη εβδομάδα ενός ISO έτους είναι η πρώτη (Γρηγοριανή) ημερολογιακή εβδομάδα ενός έτους που περιλαμβάνει μια Πέμπτη. Αυτό καλείται εβδομάδα νούμερο 1, και το ISO έτος αυτής της Πέμπτης είναι ίδιο με το Γρηγοριανό έτος.
Για παράδειγμα, το 2004 ξεκινά με Πέμπτη, συνεπώς η πρώτη εβδομάδα του ISO έτους 2004 ξεκινάει τη Δευτέρα 29 Δεκεμβρίου 2003, και τελειώνει την Κυριακή, 4 Ιανουαρίου 2004:
>>> import datetime as dt >>> dt.date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> dt.date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
Άλλαξε στην έκδοση 3.9: Το αποτέλεσμα άλλαξε από μια πλειάδα σε ένα named tuple.
- date.isoformat()¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημέρα σε μορφή ISO 8601,
YYYY-MM-DD:>>> import datetime as dt >>> dt.date(2002, 12, 4).isoformat() '2002-12-04'
- date.__str__()¶
Για μια ημέρα
d, τοstr(d)είναι ισοδύναμο μεd.isoformat().
- date.ctime()¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημέρα:
>>> import datetime as dt >>> dt.date(2002, 12, 4).ctime() 'Wed Dec 4 00:00:00 2002'
Το
d.ctime()είναι ισοδύναμο με:time.ctime(time.mktime(d.timetuple()))
σε πλατφόρμες όπου η εγγενής C
ctime()συνάρτηση (την οποία καλεί ηtime.ctime(), αλλά την οποία δεν καλεί ηdate.ctime()) συμμορφώνεται με το πρότυπο C.
- date.strftime(format)¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημερομηνία, ελεγχόμενη από μια ρητή συμβολοσειρά μορφοποίησης. Οι κωδικοί μορφοποίησης που αναφέρονται σε ώρες, λεπτά ή δευτερόλεπτα θα εμφανίζουν τιμές 0. Δείτε επίσης τα strftime() and strptime() behavior και
date.isoformat().
- date.__format__(format)¶
Ίδιο με τη μέθοδο
date.strftime(). Αυτό επιτρέπει να ορίσετε μια συμβολοσειρά μορφοποίησης για ένα αντικείμενοdateσε μορφοποιημένες συμβολοσειρές και κατά τη χρήση τηςstr.format(). Δείτε επίσης τα strftime() and strptime() behavior καιdate.isoformat().
Examples of usage: date¶
Παράδειγμα μέτρησης ημερών για ένα γεγονός:
>>> import time
>>> import datetime as dt
>>> today = dt.date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == dt.date.fromtimestamp(time.time())
True
>>> my_birthday = dt.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
Περισσότερα παραδείγματα χρήσης της date:
>>> import datetime as dt
>>> d = dt.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 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 objects¶
Ένα αντικείμενο datetime είναι ένα ενιαίο αντικείμενο που περιέχει όλες τις πληροφορίες ενός αντικειμένου date και ενός αντικειμένου time.
Like a date object, datetime assumes the current Gregorian
calendar extended in both directions; like a time object,
datetime assumes there are exactly 3600*24 seconds in every day.
Κατασκευαστής:
- class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
Τα ορίσματα year, month και day είναι υποχρεωτικά. Το tzinfo μπορεί να είναι
None, ή ένα στιγμιότυπο μιας υποκλάσηςtzinfo. Οι υπόλοιπες παράμετροι θα πρέπει να είναι ακέραιοι στα παρακάτω εύρη:MINYEAR <= year <= MAXYEAR,1 <= month <= 12,1 <= day <= number of days in the given month and year,0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Εάν ένα όρισμα εκτός αυτών των ευρών δοθεί, γίνεται raise
ValueError.Άλλαξε στην έκδοση 3.6: Προστέθηκε η παράμετρος fold.
Άλλοι κατασκευαστές, όλες οι μέθοδοι της κλάσης:
- classmethod datetime.today()¶
Επιστρέφει την τρέχουσα τοπική ημερομηνία και ώρα, με
tzinfoNone.Ισοδύναμο με:
datetime.fromtimestamp(time.time())
Δείτε επίσης
now(),fromtimestamp().Αυτή η μέθοδος είναι λειτουργικά ισοδύναμη με την
now(), αλλά χωρίς την παράμετροtz.
- classmethod datetime.now(tz=None)¶
Επιστρέφει την τρέχουσα τοπική ημερομηνία και ώρα.
Εάν το προαιρετικό όρισμα tz είναι
Noneή δεν έχει οριστεί, είναι σαν τη μέθοδοtoday(), αλλά, αν είναι δυνατόν, παρέχει μεγαλύτερη ακρίβεια από αυτή που μπορεί να ληφθεί μέσω ενός timestamp από τηνtime.time()(για παράδειγμα, αυτό μπορεί να είναι δυνατό σε πλατφόρμες που παρέχουν τη συνάρτησηgettimeofday()της C).Εάν το tz δεν είναι
None, θα πρέπει να είναι ένα στιγμιότυπο της υποκλάσηςtzinfoκαι η τρέχουσα ημερομηνία και ώρα θα μετατραπούν στην ζώνη ώρας του tz.Αυτή η συνάρτηση προτιμάται έναντι των
today()καιutcnow().Σημείωση
Οι επόμενες κλήσεις στην
datetime.now()ενδέχεται να επιστρέψουν την ίδια χρονική στιγμή, ανάλογα με την ακρίβεια του υποκείμενου ρολογιού.
- classmethod datetime.utcnow()¶
Επιστρέφει την τρέχουσα UTC ημερομηνία και ώρα, με το
tzinfoNone.Αυτό είναι σαν τη
now(), αλλά επιστρέφει την τρέχουσα ημερομηνία και ώρα UTC, ως ένα απλό αντικείμενοdatetime. Μια ενημερωμένη τρέχουσα ημερομηνία/ ώρα UTC μπορεί να ληφθεί καλώντας τοdatetime.now(timezone.utc). Δείτε επίσης τηνnow().Προειδοποίηση
Επειδή τα αδαή αντικείμενα
datetimeαντιμετωπίζονται από πολλές μεθόδουςdatetimeως τοπικές ώρες, προτιμάται η χρήση ενήμερων datetimes για την αναπαράσταση των χρόνων σε UTC. Ως εκ τούτου, ο συνιστώμενος τρόπος για να δημιουργήσετε ένα αντικείμενο που αναπαριστά την τρέχουσα ώρα σε UTC είναι καλώντας τοdatetime.now(timezone.utc).Αποσύρθηκε στην έκδοση 3.12: Χρησιμοποιήστε την
datetime.now()μεUTCκαλύτερα.
- classmethod datetime.fromtimestamp(timestamp, tz=None)¶
Επιστρέφει την τοπική ημερομηνία και ώρα που αντιστοιχεί στη χρονική σήμανση POSIX, όπως αυτή που επιστρέφεται από την
time.time(). Εάν το προαιρετικό όρισμα tz είναιNoneή δεν έχει καθοριστεί, η χρονική σήμανση μετατρέπεται στην τοπική ημερομηνία και ώρα της πλατφόρμας και το αντικείμενοdatetimeπου επιστρέφεται είναι αδαές.Εάν το tz δεν είναι
None, πρέπει να είναι μια παρουσία μιας υποκλάσηςtzinfoκαι η χρονική σήμανση μετατρέπεται στη ζώνη ώρας του tz.Η
fromtimestamp()μπορεί να κάνει raise μιαOverflowError, εάν η χρονική σήμανση είναι εκτός του εύρους τιμών που υποστηρίζονται από τις συναρτήσειςlocaltime()ήgmtime()της πλατφόρμας C, και το σφάλμαOSErrorσε περίπτωση σφάλματοςlocaltime()ήgmtime(). Είναι σύνηθες αυτό να περιορίζεται στα έτη από το 1970 έως το 2038. Σημειώστε ότι σε συστήματα εκτός POSIX που περιλαμβάνουν δευτερόλεπτα άλματος στην έννοια της χρονικής σήμανσης, τα δευτερόλεπτα άλματος αγνοούνται από τηfromtimestamp(), και στη συνέχεια είναι πιθανό να υπάρχουν δύο χρονικές σημάνσεις που διαφέρουν κατά ένα δευτερόλεπτο και αποδίδουν πανομοιότυπα αντικείμεναdatetime. Αυτή η μέθοδος προτιμάται έναντι τηςutcfromtimestamp().Άλλαξε στην έκδοση 3.3: Κάνει raise την
OverflowErrorαντί για τηValueErrorεάν η χρονική σήμανση είναι εκτός του εύρους τιμών που υποστηρίζονται από τις συναρτήσειςlocaltime()ήgmtime()της πλατφόρμας C. Κάνει raise τηνOSErrorαντί για τηValueErrorσε περίπτωση σφάλματος τωνlocaltime()ήgmtime().Άλλαξε στην έκδοση 3.6: Η
fromtimestamp()ενδέχεται να επιστρέψει στιγμιότυπα με τοfoldορισμένο σε 1.
- classmethod datetime.utcfromtimestamp(timestamp)¶
Επιστρέφει το UTC
datetimeπου αντιστοιχεί στο POSIX timestamp, με τοtzinfoNone. (Το αντικείμενο που προκύπτει είναι αδαές.)Αυτό μπορεί να κάνει raise μια
OverflowError, εάν το timestamp βρίσκεται εκτός του εύρους τιμών που υποστηρίζεται από τη συνάρτησηgmtime()της πλατφόρμας C, καιOSErrorσε περίπτωση αποτυχίας τηςgmtime(). Είναι σύνηθες αυτό να περιορίζεται σε έτη από το 1970 έως το 2038.Για να λάβετε ένα ενήμερο αντικείμενο
datetime, καλέστε τηνfromtimestamp():datetime.fromtimestamp(timestamp, timezone.utc)
Σε πλατφόρμες συμβατές με POSIX, είναι ισοδύναμο με την ακόλουθη έκφραση:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
εκτός από το ότι ο δεύτερος τύπος υποστηρίζει πάντα το πλήρες εύρος ετών: από το
MINYEARέως και τοMAXYEAR.Προειδοποίηση
Επειδή τα αδαή αντικείμενα
datetimeαντιμετωπίζονται από πολλές μεθόδους τηςdatetimeως τοπικές ώρες, προτιμάται η χρήση ενήμερων αντικειμένων datetime για την αναπαράσταση χρόνων σε UTC. Ως εκ τούτου, ο προτεινόμενος τρόπος για τη δημιουργία ενός αντικειμένου που αναπαριστά μια συγκεκριμένη χρονική σήμανση σε UTC είναι η κλήση τηςdatetime.fromtimestamp(timestamp, tz=timezone.utc).Άλλαξε στην έκδοση 3.3: Κάνει raise
OverflowErrorαντί τηςValueErrorεάν το timestamp είναι εκτός του εύρους τιμών που υποστηρίζεται από τη συνάρτησηgmtime()της πλατφόρμας C. Κάνει raiseOSErrorαντί τηςValueErrorσε περίπτωση αποτυχίας τηςgmtime().Άλλαξε στην έκδοση 3.15: Accepts any real number as timestamp, not only integer or float.
Αποσύρθηκε στην έκδοση 3.12: Χρησιμοποιεί εναλλακτικά τη
datetime.fromtimestamp()με τοUTC.
- classmethod datetime.fromordinal(ordinal)¶
Επιστέφει τη
datetimeπου αντιστοιχεί στον προληπτικό Γρηγοριανό ταξινομητή, όπου η 1η Ιανουαρίου του 1ου έτους έχει ταξινομητή 1. ΗValueErrorγίνεται raise εκτός εάν1 <= ordinal <= datetime.max.toordinal(). Η ώρα, το λεπτό, το δευτερόλεπτο και το μικροδευτερόλεπτο του αποτελέσματος είναι όλα 0, και τοtzinfoείναιNone.
- classmethod datetime.combine(date, time, tzinfo=time.tzinfo)¶
Return a new
datetimeobject whose date components are equal to the givendateobject’s, and whose time components are equal to the giventimeobject’s. If the tzinfo argument is provided, its value is used to set thetzinfoattribute of the result, otherwise thetzinfoattribute of the time argument is used. If the date argument is adatetimeobject, its time components andtzinfoattributes are ignored.Για οποιοδήποτε αντικείμενο
datetimed,d == datetime.combine(d.date(), d.time(), d.tzinfo).Άλλαξε στην έκδοση 3.6: Προστέθηκε το όρισμα tzinfo.
- classmethod datetime.fromisoformat(date_string)¶
Επιστρέφει μια
datetimeπου αντιστοιχεί σε μια date_string σε οποιαδήποτε έγκυρη μορφή ISO 8601, με τις εξής εξαιρέσεις:Οι αποκλίσεις ζώνης ώρας μπορεί να έχουν κλασματικά δευτερόλεπτα.
Ο διαχωριστής
Tμπορεί να αντικατασταθεί από οποιονδήποτε μόνο χαρακτήρα unicode.Οι κλασματικές ώρες και λεπτά δεν υποστηρίζονται.
Οι ημερομηνίες μειωμένης ακρίβειας δεν υποστηρίζονται προς το παρόν (
YYYY-MM,YYYY).Οι εκτεταμένες αναπαραστάσεις ημερομηνίας δεν υποστηρίζονται προς το παρόν (
±YYYYYY-MM-DD).Οι διατακτικές ημερομηνίες δεν υποστηρίζονται προς το παρόν (
YYYY-OOO).
Παραδείγματα:
>>> import datetime as dt >>> dt.datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) >>> dt.datetime.fromisoformat('20111104') datetime.datetime(2011, 11, 4, 0, 0) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) >>> dt.datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
Added in version 3.7.
Άλλαξε στην έκδοση 3.11: Προηγουμένως, αυτή η μέθοδος υποστήριζε μόνο μορφές που μπορούσαν να εκδοθούν από τις μεθόδους
date.isoformat()ήdatetime.isoformat().
- classmethod datetime.fromisocalendar(year, week, day)¶
Return a
datetimecorresponding to the ISO calendar date specified by year, week and day. The non-date components of the datetime are populated with their normal default values. This is the inverse of the functiondatetime.isocalendar().Added in version 3.8.
- classmethod datetime.strptime(date_string, format)¶
Επιστρέφει μια
datetimeπου αντιστοιχεί στο date_string, αναλυμένο σύμφωνα με το format.Εάν το format δεν περιέχει μικροδευτερόλεπτα ή πληροφορίες ζώνης ώρας, αυτό είναι ισοδύναμο με:
datetime(*(time.strptime(date_string, format)[0:6]))
Η
ValueErrorγίνεται raise εάν το date_string και το format δεν μπορούν να αναλυθούν από τηtime.strptime()ή αν αυτή επιστρέψει μια τιμή που δεν είναι χρονική πλειάδα. Δείτε επίσης strftime() and strptime() behavior καιdatetime.fromisoformat().Άλλαξε στην έκδοση 3.13: Εάν το format καθορίζει μια μέρα ενός μήνα χωρίς έτος, μια
DeprecationWarningεκπέμπεται. Αυτό γίνεται για να αποφευχθεί ένα σφάλμα που σχετίζεται με τα δίσεκτα έτη κάθε τέσσερα χρόνια σε κώδικα που προσπαθεί να αναλύσει μόνο μήνα και ημέρα, καθώς το προεπιλεγμένο έτος που χρησιμοποιείται όταν λείπει είναι μη δίσεκτο. Τέτοιες τιμές format μπορεί να κάνουν raise σφάλμα από την έκδοση 3.15 της Python και μετά. Η λύση είναι να περιλαμβάνετε πάντα ένα έτος στο format σας. Εάν αναλύετε τιμές date_string που δεν περιέχουν έτος, προσθέστε ρητά ένα δίσεκτο έτος πριν από την ανάλυση:>>> import datetime as dt >>> date_string = "02/29" >>> when = dt.datetime.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug. >>> when.strftime("%B %d") 'February 29'
Χαρακτηριστικά Κλάσης:
- datetime.max¶
Η τελευταία αναπαραστάσιμη τιμή
datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
- datetime.resolution¶
Η μικρότερη δυνατή διαφορά μεταξύ μη ίσων αντικειμένων
datetimeobjects,timedelta(microseconds=1).
Χαρακτηριστικά στιγμιοτύπου (μόνο για ανάγνωση):
- datetime.month¶
Μεταξύ 1 και 12 συμπεριλαμβανομένων.
- datetime.day¶
Μεταξύ 1 και του αριθμού των ημερών στον δεδομένο μήνα του δεδομένου έτους.
- datetime.hour¶
Στο
range(24).
- datetime.minute¶
Στο
range(60).
- datetime.second¶
Στο
range(60).
- datetime.microsecond¶
Στο
range(1000000).
- datetime.tzinfo¶
Το αντικείμενο που δόθηκε ως όρισμα tzinfo στον κατασκευαστή
datetimeήNoneαν δεν δόθηκε κανένα.
- datetime.fold¶
Στο
[0, 1]. Χρησιμοποιείται για την αποσαφήνιση των τοπικών ωρών σε επαναλαμβανόμενο διάστημα. (Ένα επαναλαμβανόμενο διάστημα συμβαίνει όταν τα ρολόγια γυρίζουν πίσω στο τέλος της θερινής ώρας ή όταν οι αποκλίσεις UTC για την τρέχουσα ζώνη μειώνεται για πολιτικούς λόγους.) Οι τιμές 0 και 1 αντιπροσωπεύουν, αντίστοιχα, την πρώτη και τη δεύτερη από τις δύο χρονικές στιγμές με την ίδια αναπαράσταση τοπικής ώρας.Added in version 3.6.
Υποστηριζόμενες πράξεις:
Πράξη |
Αποτέλεσμα |
|---|---|
|
(1) |
|
(2) |
|
(3) |
datetime1 == datetime2datetime1 != datetime2 |
Σύγκριση ισότητας. (4) |
datetime1 < datetime2datetime1 > datetime2datetime1 <= datetime2datetime1 >= datetime2 |
Σύγκριση σειράς. (5) |
Το
datetime2είναι μια διάρκεια τουtimedeltaπου αφαιρείται από τοdatetime1, μετακινώντας το προς τα εμπρός στο χρόνο εάνtimedelta.days > 0, ή προς τα πίσω εάνtimedelta.days < 0. Το αποτέλεσμα έχει το ίδιοtzinfoμε το εισαγόμενο datetime, καιdatetime2 - datetime1 == timedeltaμετά. ΗOverflowErrorγίνεται raise εάν τοdatetime2.yearείναι μικρότερο από τοMINYEARή μεγαλύτερο από τοMAXYEAR. Σημειώστε ότι δεν γίνονται προσαρμογές ζώνης ώρας ακόμη και αν το εισαγόμενο αντικείμενο είναι ενήμερο.Υπολογίζει το
datetime2έτσι ώστεdatetime2 + timedelta == datetime1. Όπως και για την πρόσθεση, το αποτέλεσμα έχει το ίδιοtzinfoμε το εισαγόμενο datetime, και δεν γίνονται προσαρμογές ζώνης ώρας ακόμη και αν το εισαγόμενο αντικείμενο είναι ενήμερο.Subtraction of a
datetimefrom adatetimeis defined only if both operands are naive, or if both are aware. If one is aware and the other is naive,TypeErroris raised.Εάν και οι δύο είναι αδαείς, ή και οι δύο είναι ενήμεροι και έχουν το ίδιο
tzinfoattribute, ταtzinfoαγνοούνται, και το αποτέλεσμα είναι ένα αντικείμενοtimedeltatτέτοιο ώστεdatetime2 + t == datetime1. Σε αυτή την περίπτωση δεν γίνονται προσαρμογές ζώνης ώρας.Εάν και οι δύο είναι ενήμεροι και έχουν διαφορετικά χαρακτηριστικά
tzinfo,a-bενεργεί σαν να είχαν πρώτα μετατραπεί σε αδαή UTC datetimes. Το αποτέλεσμα είναι(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())με την εξαίρεση η υλοποίηση δεν υπερχειλίζει ποτέ.Τα αντικείμενα
datetimeείναι ίσα εάν αναπαριστούν την ίδια ημερομηνία και ώρα, λαμβάνοντας υπόψη τη ζώνη ώρας.Naive and aware
datetimeobjects are never equal.If both comparands are aware, and have the same
tzinfoattribute, thetzinfoandfoldattributes are ignored and the base datetimes are compared. If both comparands are aware and have differenttzinfoattributes, the comparison acts as comparands were first converted to UTC datetimes except that the implementation never overflows.datetimeinstances in a repeated interval are never equal todatetimeinstances in other time zone.Το datetime1 θεωρείται μικρότερο από το datetime2 όταν το datetime1 προηγείται από το datetime2 στο χρόνο, λαμβάνοντας υπόψη τη ζώνη ώρας.
Η σύγκριση διάταξης μεταξύ αδαών και ενήμερων αντικειμένων
datetimeκάνει raiseTypeError.Εάν και οι δύο συγκρινόμενοι είναι ενήμεροι, και έχουν το ίδιο χαρακτηριστικό
tzinfo, τα χαρακτηριστικάtzinfoκαιfoldαγνοούνται και η βασική ημερομηνία συγκρίνεται. Εάν και οι δύο συγκρινόμενοι είναι ενήμεροι και έχουν διαφορετικά χαρακτηριστικάtzinfo, η σύγκριση ενεργεί σαν να είχαν πρώτα μετατραπεί σε αδαή UTC datetimes με την εξαίρεση ότι η υλοποίηση δεν υπερχειλίζει ποτέ.
Άλλαξε στην έκδοση 3.3: Οι συγκρίσεις ισότητας μεταξύ ενήμερων και αδαών αντικειμένων datetime δεν κάνουν raise TypeError.
Άλλαξε στην έκδοση 3.13: Η σύγκριση μεταξύ ενός αντικειμένου datetime και ενός στιγμιοτύπου της υποκλάσης date που δεν είναι υποκλάση του datetime δεν μετατρέπει πλέον το τελευταίο σε date, αγνοώντας το μέρος χρόνου και τη ζώνη ώρας. Η προεπιλεγμένη συμπεριφορά μπορεί να αλλάξει με την υπερκάλυψη των ειδικών μεθόδων σύγκρισης σε υποκλάσεις.
Μέθοδοι στιγμιοτύπου:
- datetime.time()¶
Επιστρέφει αντικείμενο
timeμε την ίδια ώρα, λεπτό, δευτερόλεπτο, μικροδευτερόλεπτο και παραμόρφωση του χρόνου. ΤοtzinfoείναιNone. Δείτε επίσης τη μέθοδοtimetz().Άλλαξε στην έκδοση 3.6: Η τιμή παραμόρφωσης αντιγράφεται στο επιστρεφόμενο αντικείμενο
time.
- datetime.timetz()¶
Επιστρέφει αντικείμενο
timeμε την ίδια ώρα, λεπτό, δευτερόλεπτο, μικροδευτερόλεπτο, παραμόρφωση του χρόνου και χαρακτηριστικά tzinfo. Δείτε επίσης τη μέθοδοtime().Άλλαξε στην έκδοση 3.6: Η τιμή παραμόρφωσης αντιγράφεται στο επιστρεφόμενο αντικείμενο
time.
- 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)¶
Επιστρέφει ένα νέο αντικείμενο
datetimeμε τα ίδια χαρακτηριστικά, αλλά με τις καθορισμένες παραμέτρους ενημερωμένες. Σημειώστε ότι μπορεί να καθοριστείtzinfo=Noneγια να δημιουργήσει ένα αδαές datetime από ένα ενήμερο datetime χωρίς μετατροπή των ημερομηνιών και των χρονικών δεδομένων.Τα αντικείμενα
datetimeυποστηρίζονται επίσης από τη γενική συνάρτησηcopy.replace().Άλλαξε στην έκδοση 3.6: Προστέθηκε η παράμετρος fold.
- datetime.astimezone(tz=None)¶
Επιστρέφει ένα αντικείμενο
datetimeμε νέο χαρακτηριστικόtzinfotz, προσαρμόζοντας τα ημερολογιακά και χρονικά δεδομένα έτσι ώστε το αποτέλεσμα να είναι η ίδια ώρα UTC όπως self, αλλά στην τοπική ώρα του tz.Εάν παρέχεται, το tz πρέπει να είναι ένα αντικείμενο της υποκλάσης
tzinfo, και οι μέθοδοιutcoffset()καιdst()δεν πρέπει να επιστρέφουνNone. Εάν το self είναι αδαές, θεωρείται ότι αναπαριστά την ώρα στην τοπική ζώνη ώρας του συστήματος.Εάν κληθεί χωρίς ορίσματα (ή με
tz=None) θεωρείται ότι η τοπική ζώνη ώρας του συστήματος είναι η στόχος ζώνη ώρας. Το χαρακτηριστικό.tzinfoτου μετατραπέντος αντικειμένου datetime θα οριστεί σε ένα αντικείμενο της κλάσηςtimezoneμε το όνομα ζώνης και την απόκλιση που αποκτήθηκαν από το λειτουργικό σύστημα.Εάν
self.tzinfoείναι tz, τότεself.astimezone(tz)είναι ίσο με το self: χωρίς προσαρμογή των ημερομηνιών ή των χρονικών δεδομένων. Διαφορετικά, το αποτέλεσμα είναι η τοπική ώρα στη ζώνη ώρας tz, αναπαριστώντας την ίδια ώρα UTC όπως το self: μετά ταastz = dt.astimezone(tz),astz - astz.utcoffset()θα έχουν τα ίδια ημερομηνιακά και χρονικά δεδομένα όπως τοdt - dt.utcoffset().Εάν απλώς θέλετε να επισυνάψετε ένα αντικείμενο
timezonetz σε ένα datetime dt χωρίς προσαρμογή των ημερομηνιών και των χρονικών δεδομένων, χρησιμοποιήστεdt.replace(tzinfo=tz). Εάν απλώς θέλετε να αφαιρέσετε το αντικείμενοtimezoneαπό ένα ενήμερο datetime dt χωρίς μετατροπή των ημερομηνιών και των χρονικών δεδομένων, χρησιμοποιήστεdt.replace(tzinfo=None).Σημειώστε ότι η προεπιλεγμένη μέθοδος
tzinfo.fromutc()μπορεί να υπερκαλύπτεται σε μια υποκλάσηtzinfoγια να επηρεάσει το αποτέλεσμα που επιστρέφεται από τη μέθοδοastimezone(). Αγνοώντας περιπτώσεις σφάλματος, ηastimezone()λειτουργεί όπως:def 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)
Άλλαξε στην έκδοση 3.3: Το tz μπορεί τώρα να παραλειφθεί.
Άλλαξε στην έκδοση 3.6: Η μέθοδος
astimezone()μπορεί τώρα να κληθεί σε αδαή αντικείμενα που θεωρούνται ότι αναπαριστούν την τοπική ώρα του συστήματος.
- datetime.utcoffset()¶
Εάν το
tzinfoείναιNone, επιστρέφειNone, αλλιώς επιστρέφειself.tzinfo.utcoffset(self)και κάνει raise μια εξαίρεση εάν το τελευταίο δεν επιστρέφειNoneή ένα αντικείμενοtimedeltaμε μέγεθος μικρότερο από μια ημέρα.Άλλαξε στην έκδοση 3.7: Η απόκλιση UTC δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- datetime.dst()¶
Εάν το
tzinfoείναιNone, επιστρέφειNone, αλλιώς επιστρέφειself.tzinfo.dst(self)και κάνει raise μια εξαίρεση εάν το τελευταίο δεν επιστρέφειNoneή ένα αντικείμενοtimedeltaμε μέγεθος μικρότερο από μια ημέρα.Άλλαξε στην έκδοση 3.7: Η απόκλιση DST δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- datetime.tzname()¶
Εάν το
tzinfoείναιNone, επιστρέφειNone, αλλιώς επιστρέφειself.tzinfo.tzname(self), κάνει raise μια εξαίρεση εάν το τελευταίο δεν επιστρέφειNoneή ένα αντικείμενο string,
- datetime.timetuple()¶
Επιστρέφει μια
time.struct_timeόπως επιστρέφεται από τηνtime.localtime().Το
d.timetuple()είναι ισοδύναμο με:time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))
όπου
yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1είναι ο αριθμός της ημέρας μέσα στο τρέχον έτος ξεκινώντας από 1 για την 1η Ιανουαρίου. Το χαρακτηριστικόtm_isdstτου αποτελέσματος ορίζεται σύμφωνα με τη μέθοδοdst(): εάνtzinfoείναιNoneή εάν ηdst()επιστρέφειNone, τότε τοtm_isdstορίζεται σε- 1; αλλιώς, εάν ηdst()επιστρέφει μια μη μηδενική τιμή, τότεtm_isdstορίζεται σε 1; αλλιώς, τοtm_isdstορίζεται σε 0.
- datetime.utctimetuple()¶
Εάν το στιγμιότυπο
datetimedείναι αδαές, αυτό είναι το ίδιο με τοd.timetuple()εκτός αν τοtm_isdstορίζεται σε 0 ανεξάρτητα από το τι επιστρέφει ηd.dst(). Η θερινή ώρα δεν ισχύει ποτέ για μια ώρα UTC.Εάν το
dείναι ενήμερο, τοdκανονικοποιείται σε ώρα UTC, αφαιρώντας τοd.utcoffset(), και μιαtime.struct_timeγια την κανονικοποιημένη ώρα επιστρέφεται. Τοtm_isdstορίζεται σε 0. Σημειώστε ότι μπορεί να γίνει raise μιαOverflowErrorεάν τοd.yearήτανMINYEARήMAXYEARκαι η προσαρμογή UTC υπερβαίνει ένα όριο έτους.Προειδοποίηση
Επειδή τα αδαή αντικείμενα
datetimeαντιμετωπίζονται από πολλές μεθόδουςdatetimeως τοπικές ώρες, προτιμάται η χρήση ενήμερων datetimes για την αναπαράσταση ωρών σε UTC∙ ως αποτέλεσμα, η χρήση τηςdatetime.utctimetuple()μπορεί να δώσει παραπλανητικά αποτελέσματα. Εάν έχετε ένα αδαέςdatetimeπου αναπαριστά την ώρα σε UTC, χρησιμοποιήστεdatetime.replace(tzinfo=timezone.utc)για να το κάνετε ενήμερο, οπότε μπορείτε να χρησιμοποιήσετε τη μέθοδοdatetime.timetuple().
- datetime.toordinal()¶
Επιστρέφει τον προληπτικό Γρηγοριανό αριθμό της ημερομηνίας. Το ίδιο με το
self.date().toordinal().
- datetime.timestamp()¶
Επιστρέφει το χρονικό σήμα POSIX που αντιστοιχεί στο στιγμιότυπο
datetime. Η επιστρεφόμενη τιμή είναι έναfloatπαρόμοιο με αυτό που επιστρέφεται από τη συνάρτησηtime.time().Naive
datetimeinstances are assumed to represent local time and this method relies on the platform Cmktime()function to perform the conversion. Sincedatetimesupports wider range of values thanmktime()on many platforms, this method may raiseOverflowErrororOSErrorfor times far in the past or far in the future.Για τα ενήμερα στιγμιότυπα
datetime, η επιστρεφόμενη τιμή υπολογίζεται ως:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
Σημείωση
Δεν υπάρχει μέθοδος για να αποκτήσετε το χρονικό σήμα POSIX απευθείας από ένα αδαές στιγμιότυπο
datetimeπου αναπαριστά την ώρα σε UTC. Εάν η εφαρμογή σας χρησιμοποιεί αυτή τη σύμβαση και η ζώνη ώρας του συστήματός σας δεν είναι ρυθμισμένη σε UTC, μπορείτε να αποκτήσετε το χρονικό σήμα POSIX παρέχονταςtzinfo=timezone.utc:timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
ή με τον υπολογισμό του χρονικού σήματος απευθείας:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Added in version 3.3.
Άλλαξε στην έκδοση 3.6: Η μέθοδος
timestamp()χρησιμοποιεί το χαρακτηριστικόfoldγια να διασαφηνίσει τις ώρες κατά τη διάρκεια ενός επαναλαμβανόμενου διαστήματος.
- datetime.weekday()¶
Επιστρέφει την ημέρα της εβδομάδας ως ακέραιο, όπου η Δευτέρα είναι 0 και η Κυριακή είναι 6. Το ίδιο με το
self.date().weekday(). Δείτε επίσηςisoweekday().
- datetime.isoweekday()¶
Επιστρέφει την ημέρα της εβδομάδας ως ακέραιο, όπου η Δευτέρα είναι 1 και η Κυριακή είναι 7. Το ίδιο με το
self.date().isoweekday(). Δείτε επίσηςweekday(),isocalendar().
- datetime.isocalendar()¶
Επιστρέφει ένα named tuple με τρία συστατικά:
year,weekκαιweekday. Το ίδιο με τοself.date().isocalendar().
- datetime.isoformat(sep='T', timespec='auto')¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημερομηνία και ώρα σε μορφή ISO 8601:
YYYY-MM-DDTHH:MM:SS.ffffff, εάν τοmicrosecondδεν είναι 0YYYY-MM-DDTHH:MM:SS, εάν τοmicrosecondείναι 0
Εάν η
utcoffset()δεν επιστρέψειNone, προστίθεται μια συμβολοσειρά που δίνει την απόκλιση UTC:YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], εάν τοmicrosecondδεν είναι 0YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]], εάν τοmicrosecondείναι 0
Παραδείγματα:
>>> import datetime as dt >>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat() '2019-05-18T15:17:08.132263' >>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat() '2019-05-18T15:17:00+00:00'
Το προαιρετικό όρισμα sep (προεπιλογή
'T') είναι ένας χαρακτήρας διαχωρισμού, τοποθετημένος μεταξύ των τμημάτων ημερομηνίας και ώρας του αποτελέσματος. Για παράδειγμα:>>> import datetime as dt >>> class TZ(dt.tzinfo): ... """A time zone with an arbitrary, constant -06:39 offset.""" ... def utcoffset(self, when): ... return dt.timedelta(hours=-6, minutes=-39) ... >>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') '2002-12-25 00:00:00-06:39' >>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat() '2009-11-27T00:00:00.000100-06:39'
Η προαιρετική παράμετρος timespec καθορίζει τον αριθμό των επιπλέον στοιχείων της ώρας που θα συμπεριληφθούν (η προεπιλογή είναι
'auto'). Μπορεί να είναι ένα από τα εξής:'auto': Το ίδιο με'seconds'εάν τοmicrosecondείναι 0, διαφορετικά το ίδιο με'microseconds'.'hours': Συμπεριλαμβάνει τηνhourσε μορφή δύο ψηφίωνHH.'minutes': Συμπεριλαμβάνει τηνhourκαι τηνminuteσε μορφήHH:MM.'seconds': Συμπεριλαμβάνει τηνhour, τηνminuteκαι τηνsecondσε μορφήHH:MM:SS.'milliseconds': Συμπεριλαμβάνει πλήρη ώρα, αλλά κόβει το κλασματικό μέρος του δευτερολέπτου σε χιλιοστά του δευτερολέπτου.'microseconds': Συμπεριλαμβάνει πλήρη ώρα σε μορφήHH:MM:SS.ffffff.
Σημείωση
Τα εξαιρούμενα στοιχεία ώρας κόβονται, δεν στρογγυλοποιούνται.
Η
ValueErrorθα γίνει raise σε μη έγκυρο όρισμα timespec:>>> import datetime as dt >>> dt.datetime.now().isoformat(timespec='minutes') '2002-12-25T00:00' >>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0) >>> my_datetime.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000'
Άλλαξε στην έκδοση 3.6: Προστέθηκε η παράμετρος timespec.
- datetime.__str__()¶
Για ένα στιγμιότυπο
datetimed, τοstr(d)είναι ισοδύναμο με τοd.isoformat(' ').
- datetime.ctime()¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημερομηνία και ώρα:
>>> import datetime as dt >>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime() 'Wed Dec 4 20:30:40 2002'
Η συμβολοσειρά εξόδου δεν θα περιλαμβάνει πληροφορίες ζώνης ώρας, ανεξάρτητα από το αν η είσοδος είναι ενήμερη ή αδαής.
Το
d.ctime()είναι ισοδύναμο με:time.ctime(time.mktime(d.timetuple()))
σε πλατφόρμες όπου η εγγενής συνάρτηση
ctime()της C (την οποία καλεί ηtime.ctime(), αλλά την οποία δεν καλεί ηdatetime.ctime()) συμμορφώνεται με το πρότυπο C.
- datetime.strftime(format)¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ημερομηνία και ώρα, ελεγχόμενη από μια ρητή μορφή συμβολοσειράς. Δείτε επίσης strftime() and strptime() behavior και
datetime.isoformat().
- datetime.__format__(format)¶
Παρόμοια με τη μέθοδο
datetime.strftime(). Αυτό καθιστά δυνατό τον καθορισμό μιας μορφής συμβολοσειράς για ένα αντικείμενοdatetimeσε formatted string literals και κατά τη χρήση τηςstr.format(). Δείτε επίσης strftime() and strptime() behavior καιdatetime.isoformat().
Examples of usage: datetime¶
Παραδείγματα εργασίας με αντικείμενα datetime:
>>> import datetime as dt
>>> # Using datetime.combine()
>>> d = dt.date(2005, 7, 14)
>>> t = dt.time(12, 30)
>>> dt.datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)
>>> # Using datetime.now()
>>> dt.datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1
>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)
>>> # Using datetime.strptime()
>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> my_datetime
datetime.datetime(2006, 11, 21, 16, 30)
>>> # Using datetime.timetuple() to get tuple of all attributes
>>> tt = my_datetime.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 = my_datetime.isocalendar()
>>> for it in ic:
... print(it)
...
2006 # ISO year
47 # ISO week
2 # ISO weekday
>>> # Formatting a datetime
>>> my_datetime.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(my_datetime, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'
Το παρακάτω παράδειγμα ορίζει μια υποκλάση tzinfo που λαμβάνει τις πληροφορίες για ζώνη ώρας για την Καμπούλ, στο Αφγανιστάν, η οποία χρησιμοποιούσε +4 UTC μέχρι το 1945 και στη συνέχεια +4:30 UTC από τότε:
import datetime as dt
class KabulTz(dt.tzinfo):
# Kabul used +4 until 1945, when they moved to +4:30
UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)
def utcoffset(self, when):
if when.year < 1945:
return dt.timedelta(hours=4)
elif (1945, 1, 1, 0, 0) <= when.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 when falls in the imaginary range, use fold to decide how
# to resolve. See PEP 495.
return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))
else:
return dt.timedelta(hours=4, minutes=30)
def fromutc(self, when):
# Follow same validations as in datetime.tzinfo
if not isinstance(when, dt.datetime):
raise TypeError("fromutc() requires a datetime argument")
if when.tzinfo is not self:
raise ValueError("when.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 when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:
return when + dt.timedelta(hours=4, minutes=30)
else:
return when + dt.timedelta(hours=4)
def dst(self, when):
# Kabul does not observe daylight saving time.
return dt.timedelta(0)
def tzname(self, when):
if when >= self.UTC_MOVE_DATE:
return "+04:30"
return "+04"
Χρήση του KabulTz από το παραπάνω παράδειγμα:
>>> tz1 = KabulTz()
>>> # Datetime before the change
>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00
>>> # Datetime after the change
>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00
>>> # Convert datetime to another time zone
>>> dt3 = dt2.astimezone(dt.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 objects¶
Ένα αντικείμενο time αναπαριστά μια (τοπική) ώρα της ημέρας, ανεξάρτητη από οποιαδήποτε ημέρα, και υπόκειται σε προσαρμογή μέσω ενός αντικειμένου tzinfo.
- class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶
Όλα τα ορίσματα είναι προαιρετικά. Το tzinfo μπορεί να είναι
None, ή ένα στιγμιότυπο μιας υποκλάσηςtzinfo. Τα υπόλοιπα ορίσματα πρέπει να είναι ακέραιοι στα ακόλουθα εύρη:0 <= hour < 24,0 <= minute < 60,0 <= second < 60,0 <= microsecond < 1000000,fold in [0, 1].
Εάν δοθεί ένα όρισμα εκτός αυτών των ευρών, γίνεται raise
ValueError. Όλες οι προεπιλογές είναι 0 εκτός από το tzinfo, το οποίο προεπιλέγεται σεNone.
Χαρακτηριστικά Κλάσης:
- time.resolution¶
Η μικρότερη δυνατή διαφορά μεταξύ μη ίσων αντικειμένων
time,timedelta(microseconds=1), αν και σημειώστε ότι η αριθμητική σε αντικείμεναtimeδεν υποστηρίζεται.
Χαρακτηριστικά στιγμιοτύπου (μόνο για ανάγνωση):
- time.hour¶
Στο
range(24).
- time.minute¶
Στο
range(60).
- time.second¶
Στο
range(60).
- time.microsecond¶
Στο
range(1000000).
- time.tzinfo¶
Το αντικείμενο που δόθηκε ως όρισμα tzinfo στον κατασκευαστή
time, ήNoneεάν δεν δόθηκε κανένα.
- time.fold¶
Στο
[0, 1]. Χρησιμοποιείται για την αποσαφήνιση των τοπικών ωρών σε επαναλαμβανόμενο διάστημα. (Ένα επαναλαμβανόμενο διάστημα συμβαίνει όταν τα ρολόγια γυρίζουν πίσω στο τέλος της θερινής ώρας ή όταν οι αποκλίσεις UTC για την τρέχουσα ζώνη μειώνεται για πολιτικούς λόγους.) Οι τιμές 0 και 1 αντιπροσωπεύουν, αντίστοιχα, την πρώτη και τη δεύτερη από τις δύο χρονικές στιγμές με την ίδια αναπαράσταση τοπικής ώρας.Added in version 3.6.
Τα αντικείμενα time υποστηρίζουν συγκρίσεις ισότητας και τάξης, όπου το a θεωρείται μικρότερο από το b όταν το a προηγείται του b στον χρόνο.
Αδαείς και ενήμερα αντικείμενα time δεν είναι ποτέ ίσα. Η σύγκριση τάξης μεταξύ αδαών και ενήμερων αντικειμένων time προκαλεί TypeError.
Εάν και τα δύο συγκρινόμενα αντικείμενα είναι ενήμερα, και έχουν το ίδιο χαρακτηριστικό tzinfo, τα χαρακτηριστικά tzinfo και fold αγνοούνται και η βάση των ωρών συγκρίνεται. Εάν και τα δύο συγκρινόμενα αντικείμενα είναι ενήμερα και έχουν διαφορετικά χαρακτηριστικά tzinfo, τα συγκρινόμενα αντικείμενα προσαρμόζονται πρώτα αφαιρώντας τις UTC μετατοπίσεις τους (που αποκτώνται από self.utcoffset()).
Άλλαξε στην έκδοση 3.3: Οι συγκρίσεις ισότητας μεταξύ ενήμερων και αδαών στιγμιοτύπων time δεν κάνουν raise TypeError.
Σε λογικά συμφραζόμενα, ένα αντικείμενο time θεωρείται πάντα αληθές.
Άλλαξε στην έκδοση 3.5: Before Python 3.5, a time object was considered to be false if it
represented midnight in UTC. This behavior was considered obscure and
error-prone and has been removed in Python 3.5. See bpo-13936 for more
information.
Άλλοι κατασκευαστές:
- classmethod time.fromisoformat(time_string)¶
Επιστρέφει μια
timeπου αντιστοιχεί σε ένα time_string σε οποιαδήποτε έγκυρη μορφή ISO 8601, με τις ακόλουθες εξαιρέσεις:Οι αποκλίσεις ζώνης ώρας μπορεί να έχουν κλασματικά δευτερόλεπτα.
Το αρχικό
T, που απαιτείται κανονικά σε περιπτώσεις όπου μπορεί να υπάρχει αμφιβολία μεταξύ μιας ημερομηνίας και μιας ώρας, δεν απαιτείται.Τα κλασματικά δευτερόλεπτα μπορούν να έχουν οποιονδήποτε αριθμό ψηφίων (οτιδήποτε πέρα από 6 θα κοπεί).
Οι κλασματικές ώρες και λεπτά δεν υποστηρίζονται.
Παραδείγματα:
>>> import datetime as dt >>> dt.time.fromisoformat('04:23:01') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('T04:23:01') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('T042301') datetime.time(4, 23, 1) >>> dt.time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) >>> dt.time.fromisoformat('04:23:01,000384') datetime.time(4, 23, 1, 384) >>> dt.time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) >>> dt.time.fromisoformat('04:23:01Z') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) >>> dt.time.fromisoformat('04:23:01+00:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
Added in version 3.7.
Άλλαξε στην έκδοση 3.11: Προηγουμένως, αυτή η μέθοδος υποστήριζε μόνο μορφές που θα μπορούσαν να εκδοθούν από τη
time.isoformat().
- classmethod time.strptime(date_string, format)¶
Επιστρέφει μια
timeπου αντιστοιχεί στο date_string, αναλυμένο σύμφωνα με το format.Εάν το format δεν περιλαμβάνει μικροδευτερόλεπτα ή πληροφορίες ζώνης ώρας, αυτό είναι ισοδύναμο με:
time(*(time.strptime(date_string, format)[3:6]))
Μια
ValueErrorθα γίνει raise αν το date_string και το format δεν μπορούν να αναλυθούν από τηνtime.strptime()ή αν επιστρέφει μια τιμή που δεν είναι τουλάχιστον μια πλειάδα ώρας. Δείτε επίσης strftime() and strptime() behavior καιtime.fromisoformat().Added in version 3.14.
Μέθοδοι στιγμιοτύπου:
- time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)¶
Return a new
timewith the same values, but with specified parameters updated. Note thattzinfo=Nonecan be specified to create a naivetimefrom an awaretime, without conversion of the time data.Η
timeυποστηρίζεται επίσης από τη γενική συνάρτησηcopy.replace().Άλλαξε στην έκδοση 3.6: Προστέθηκε η παράμετρος fold.
- time.isoformat(timespec='auto')¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ώρα σε μορφή ISO 8601, μία από τις εξής:
HH:MM:SS.ffffff, αν τοmicrosecondδεν είναι 0HH:MM:SS, αν τοmicrosecondείναι 0HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]], εάν ηutcoffset()δεν επιστρέφειNoneHH:MM:SS+HH:MM[:SS[.ffffff]], αν τοmicrosecondείναι 0 και τοutcoffset()δεν επιστρέφειNone
Η προαιρετική παράμετρος timespec καθορίζει τον αριθμό των επιπλέον στοιχείων της ώρας που θα συμπεριληφθούν (η προεπιλογή είναι
'auto'). Μπορεί να είναι ένα από τα εξής:'auto': Το ίδιο με'seconds'εάν τοmicrosecondείναι 0, διαφορετικά το ίδιο με'microseconds'.'hours': Συμπεριλαμβάνει τηνhourσε μορφή δύο ψηφίωνHH.'minutes': Συμπεριλαμβάνει τηνhourκαι τηνminuteσε μορφήHH:MM.'seconds': Συμπεριλαμβάνει τηνhour, τηνminuteκαι τηνsecondσε μορφήHH:MM:SS.'milliseconds': Συμπεριλαμβάνει πλήρη ώρα, αλλά κόβει το κλασματικό μέρος του δευτερολέπτου σε χιλιοστά του δευτερολέπτου.'microseconds': Συμπεριλαμβάνει πλήρη ώρα σε μορφήHH:MM:SS.ffffff.
Σημείωση
Τα εξαιρούμενα στοιχεία ώρας κόβονται, δεν στρογγυλοποιούνται.
Μια
ValueErrorθα γίνει raise για μια μη έγκυρη παράμετρο timespec.Παράδειγμα:
>>> import datetime as dt >>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') '12:34' >>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0) >>> my_time.isoformat(timespec='microseconds') '12:34:56.000000' >>> my_time.isoformat(timespec='auto') '12:34:56'
Άλλαξε στην έκδοση 3.6: Προστέθηκε η παράμετρος timespec.
- time.__str__()¶
Για μια ώρα
t, τοstr(t)είναι ισοδύναμο με τοt.isoformat().
- time.strftime(format)¶
Επιστρέφει μια συμβολοσειρά που αναπαριστά την ώρα, ελεγχόμενη από μια ρητή συμβολοσειρά μορφοποίησης. Δείτε επίσης strftime() and strptime() behavior και
time.isoformat().
- time.__format__(format)¶
Ίδιο με την
time.strftime(). Αυτό καθιστά δυνατό τον ορισμό μιας συμβολοσειράς μορφοποίησης για ένα αντικείμενοtimeσε formatted string literals και κατά τη χρήση της μεθόδουstr.format(). Δείτε επίσης strftime() and strptime() behavior καιtime.isoformat().
- time.utcoffset()¶
Εάν το
tzinfoείναιNone, επιστρέφειNone, διαφορετικά επιστρέφειself.tzinfo.utcoffset(None), και κάνει raise μια εξαίρεση εάν το τελευταίο δεν επιστρέφειNoneή ένα αντικείμενοtimedeltaμε μέγεθος μικρότερο από μια ημέρα.Άλλαξε στην έκδοση 3.7: Η απόκλιση UTC δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- time.dst()¶
Εάν το
tzinfoείναιNone, επιστρέφειNone, αλλιώς επιστρέφειself.tzinfo.dst(None), και κάνει raise μια εξαίρεση εάν το τελευταίο δεν επιστρέφειNone, ή ένα αντικείμενοtimedeltaμε μέγεθος μικρότερο από μια ήμερα.Άλλαξε στην έκδοση 3.7: Η απόκλιση DST δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- time.tzname()¶
Εάν το
tzinfoείναιNone, επιστρέφειNone, αλλιώς επιστρέφειself.tzinfo.tzname(None), ή κάνει raise μια εξαίρεση εάν το τελευταίο δεν επιστρέφειNoneή ένα αντικείμενο συμβολοσειράς.
Examples of usage: time¶
Παραδείγματα εργασίας με ένα αντικείμενο time:
>>> import datetime as dt
>>> class TZ1(dt.tzinfo):
... def utcoffset(self, when):
... return dt.timedelta(hours=1)
... def dst(self, when):
... return dt.timedelta(0)
... def tzname(self, when):
... return "+01:00"
... def __repr__(self):
... return f"{self.__class__.__name__}()"
...
>>> t = dt.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 objects¶
- class datetime.tzinfo¶
This is an abstract base class, meaning that this class should not be instantiated directly. Define a subclass of
tzinfoto capture information about a particular time zone.An instance of (a concrete subclass of)
tzinfocan be passed to the constructors fordatetimeandtimeobjects. The latter objects view their attributes as being in local time, and thetzinfoobject supports methods revealing offset of local time from UTC, the name of the time zone, and DST offset, all relative to a date or time object passed to them.You need to derive a concrete subclass, and (at least) supply implementations of the standard
tzinfomethods needed by thedatetimemethods you use. Thedatetimemodule providestimezone, a simple concrete subclass oftzinfowhich can represent time zones with fixed offset from UTC such as UTC itself or North American EST and EDT.Special requirement for pickling: A
tzinfosubclass must have an__init__()method that can be called with no arguments, otherwise it can be pickled but possibly not unpickled again. This is a technical requirement that may be relaxed in the future.Μια συγκεκριμένη υποκλάση της
tzinfoμπορεί να χρειαστεί να υλοποιήσει τις παρακάτω μεθόδους. Το ποιες μέθοδοι ακριβώς χρειάζονται εξαρτάται από τις χρήσεις που γίνονται σε αντικείμεναdatetimeπου είναι ενήμερα για τη ζώνη ώρας. Εάν έχετε αμφιβολίες, απλά υλοποιήστε τα όλα.
- tzinfo.utcoffset(dt)¶
Επιστρέφει την απόκλιση της τοπικής ώρας από το UTC, ως αντικείμενο
timedeltaπου είναι θετικό ανατολικά του UTC. Εάν η τοπική ώρα είναι δυτικά του UTC, αυτό θα πρέπει να είναι αρνητικό.Αυτό αναπαριστά τη συνολική απόκλιση από το UTC. Για παράδειγμα, εάν ένα αντικείμενο
tzinfoαναπαριστά τόσο τη ζώνη ώρας όσο και τις προσαρμογές DST, ηutcoffset()θα πρέπει να επιστρέφει το άθροισμά τους. Εάν η απόκλιση UTC δεν είναι γνωστή, επιστρέψειNone. Διαφορετικά, η τιμή που επιστρέφεται πρέπει να είναι ένα αντικείμενοtimedeltaαυστηρά μεταξύ-timedelta(hours=24)καιtimedelta(hours=24)(η μεγέθυνση της απόκλισης πρέπει να είναι μικρότερη από μία ημέρα). Οι περισσότερες υλοποιήσεις τηςutcoffset()θα μοιάζουν με μία από τις παρακάτω δύο:return CONSTANT # fixed-offset class return CONSTANT + self.dst(dt) # daylight-aware class
Εάν η
utcoffset()δεν επιστρέφειNone, τότε ούτε ηdst()δεν θα πρέπει να επιστρέφειNone.Η προεπιλεγμένη υλοποίηση της
utcoffset()κάνει raiseNotImplementedError.Άλλαξε στην έκδοση 3.7: Η απόκλιση UTC δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- tzinfo.dst(dt)¶
Επιστρέφει την προσαρμογή της θερινής ώρας (DST), ως αντικείμενο
timedeltaήNoneεάν οι πληροφορίες για τη θερινή ώρα δεν είναι γνωστές.Επιστρέφει
timedelta(0)εάν το DST δεν είναι σε ισχύ. Εάν το DST είναι σε ισχύ, επιστρέφει την απόκλιση ως αντικείμενοtimedelta(βλ.utcoffset()για λεπτομέρειες). Σημειώστε ότι η απόκλιση DST, εάν ισχύει, έχει ήδη προστεθεί στην απόκλιση UTC που επιστρέφεται από τηνutcoffset(), επομένως δεν υπάρχει ανάγκη να συμβουλευτείτε τηνdst()εκτός αν σας ενδιαφέρει να αποκτήσετε πληροφορίες DST ξεχωριστά. Για παράδειγμα, ηdatetime.timetuple()καλεί τη μέθοδοdst()του χαρακτηριστικούtzinfoγια να καθορίσει πώς θα πρέπει να ρυθμιστεί η σημαίαtm_isdst, και ηtzinfo.fromutc()καλεί τηνdst()για να υπολογίσει για τις αλλαγές DST όταν διασχίζει ζώνες ώρας.Ένα στιγμιότυπο tz μιας υποκλάσης
tzinfoπου μοντελοποιεί τόσο τις κανονικές όσο και τις θερινές ώρες πρέπει να είναι συνεπές σε αυτό το σημείο:tz.utcoffset(dt) - tz.dst(dt)must return the same result for every
datetimedt withdt.tzinfo == tz. For sanetzinfosubclasses, this expression yields the time zone’s «standard offset», which should not depend on the date or the time, but only on geographic location. The implementation ofdatetime.astimezone()relies on this, but cannot detect violations; it’s the programmer’s responsibility to ensure it. If atzinfosubclass cannot guarantee this, it may be able to override the default implementation oftzinfo.fromutc()to work correctly withastimezone()regardless.Οι περισσότερες υλοποιήσεις της
dst()θα μοιάζουν μάλλον με μία από αυτές τις δύο:import datetime as dt def dst(self, when): # a fixed-offset class: doesn't account for DST return dt.timedelta(0)
ή:
import datetime as dt def dst(self, when): # Code to set dston and dstoff to the time zone's DST # transition times based on the input when.year, and expressed # in standard local time. if dston <= when.replace(tzinfo=None) < dstoff: return dt.timedelta(hours=1) else: return dt.timedelta(0)
Η προεπιλεγμένη υλοποίηση της
dst()κάνει raiseNotImplementedError.Άλλαξε στην έκδοση 3.7: Η απόκλιση DST δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- tzinfo.tzname(dt)¶
Return the time zone name corresponding to the
datetimeobject dt, as a string. Nothing about string names is defined by thedatetimemodule, and there’s no requirement that it mean anything in particular. For example,"GMT","UTC","-500","-5:00","EDT","US/Eastern","America/New York"are all valid replies. ReturnNoneif a string name isn’t known. Note that this is a method rather than a fixed string primarily because sometzinfosubclasses will wish to return different names depending on the specific value of dt passed, especially if thetzinfoclass is accounting for daylight time.Η προεπιλεγμένη υλοποίηση της
tzname()κάνει raiseNotImplementedError.
These methods are called by a datetime or time object, in
response to their methods of the same names. A datetime object passes
itself as the argument, and a time object passes None as the
argument. A tzinfo subclass’s methods should therefore be prepared to
accept a dt argument of None, or of class datetime.
When None is passed, it’s up to the class designer to decide the best
response. For example, returning None is appropriate if the class wishes to
say that time objects don’t participate in the tzinfo protocols. It
may be more useful for utcoffset(None) to return the standard UTC offset, as
there is no other convention for discovering the standard offset.
When a datetime object is passed in response to a datetime
method, dt.tzinfo is the same object as self. tzinfo methods can
rely on this, unless user code calls tzinfo methods directly. The
intent is that the tzinfo methods interpret dt as being in local
time, and not need worry about objects in other time zones.
Υπάρχει μια ακόμη μέθοδος tzinfo που μια υποκλάση μπορεί να θέλει να την παρακάμψει:
- tzinfo.fromutc(dt)¶
Αυτό καλείται από την προεπιλεγμένη υλοποίηση της
datetime.astimezone(). Όταν καλείται από αυτήν, τοdt.tzinfoείναι self, και τα δεδομένα ημερομηνίας και ώρας του dt πρέπει να θεωρούνται ότι εκφράζουν μια ώρα UTC. Ο σκοπός τηςfromutc()είναι να προσαρμόσει τα δεδομένα ημερομηνίας και ώρας, επιστρέφοντας ένα ισοδύναμο αντικείμενο ημερομηνίας και ώρας στην τοπική ώρα του self.Οι περισσότερες υποκλάσεις
tzinfoθα πρέπει να μπορούν να κληρονομήσουν την προεπιλεγμένη υλοποίηση τηςfromutc()χωρίς προβλήματα. Είναι αρκετά ισχυρή για να χειριστεί ζώνες ώρας με σταθερή απόκλιση, καθώς και ζώνες ώρας που λογαριάζουν τόσο την κανονική όσο και τη θερινή ώρα, και το τελευταίο ακόμη και αν οι χρόνοι μετάβασης της θερινής ώρας διαφέρουν σε διαφορετικά έτη. Ένα παράδειγμα ζώνης ώρας που η προεπιλεγμένη υλοποίηση τηςfromutc()μπορεί να μην χειρίζεται σωστά σε όλες τις περιπτώσεις είναι μια όπου η κανονική απόκλιση (από το UTC) εξαρτάται από την συγκεκριμένη ημερομηνία και ώρα που περνά, κάτι που μπορεί να συμβεί για πολιτικούς λόγους. Οι προεπιλεγμένες υλοποιήσεις τωνastimezone()καιfromutc()μπορεί να μην παράγουν το αποτέλεσμα που θέλετε εάν το αποτέλεσμα είναι μία από τις ώρες που περικλείουν τη στιγμή που αλλάζει η κανονική απόκλιση.Παραλείποντας τον κώδικα για περιπτώσεις σφαλμάτων, η προεπιλεγμένη υλοποίηση της
fromutc()λειτουργεί ως εξής:import datetime as dt def fromutc(self, when): # raise ValueError error if when.tzinfo is not self dtoff = when.utcoffset() dtdst = when.dst() # raise ValueError if dtoff is None or dtdst is None delta = dtoff - dtdst # this is self's standard offset if delta: when += delta # convert to standard local time dtdst = when.dst() # raise ValueError if dtdst is None if dtdst: return when + dtdst else: return when
Στο παρακάτω αρχείο tzinfo_examples.py υπάρχουν μερικά παραδείγματα κλάσεων tzinfo:
import datetime as dt
# 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
ZERO = dt.timedelta(0)
HOUR = dt.timedelta(hours=1)
SECOND = dt.timedelta(seconds=1)
STDOFFSET = dt.timedelta(seconds=-time.timezone)
if time.daylight:
DSTOFFSET = dt.timedelta(seconds=-time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(dt.tzinfo):
def fromutc(self, when):
assert when.tzinfo is self
stamp = (when - 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 dt.datetime(*args, microsecond=when.microsecond,
tzinfo=self, fold=fold)
def utcoffset(self, when):
if self._isdst(when):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, when):
if self._isdst(when):
return DSTDIFF
else:
return ZERO
def tzname(self, when):
return time.tzname[self._isdst(when)]
def _isdst(self, when):
tt = (when.year, when.month, when.day,
when.hour, when.minute, when.second,
when.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(when):
days_to_go = 6 - when.weekday()
if days_to_go:
when += dt.timedelta(days_to_go)
return when
# 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 = dt.datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = dt.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 = dt.datetime(1, 4, 1, 2)
DSTEND_1987_2006 = dt.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 = dt.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 (dt.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(dt.tzinfo):
def __init__(self, hours, reprname, stdname, dstname):
self.stdoffset = dt.timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname
def __repr__(self):
return self.reprname
def tzname(self, when):
if self.dst(when):
return self.dstname
else:
return self.stdname
def utcoffset(self, when):
return self.stdoffset + self.dst(when)
def dst(self, when):
if when is None or when.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 when.tzinfo is self.
return ZERO
assert when.tzinfo is self
start, end = us_dst_range(when.year)
# Can't compare naive to aware objects, so strip the timezone from
# when first.
when = when.replace(tzinfo=None)
if start + HOUR <= when < end - HOUR:
# DST is in effect.
return HOUR
if end - HOUR <= when < end:
# Fold (an ambiguous hour): use when.fold to disambiguate.
return ZERO if when.fold else HOUR
if start <= when < start + HOUR:
# Gap (a non-existent hour): reverse the fold rule.
return HOUR if when.fold else ZERO
# DST is off.
return ZERO
def fromutc(self, when):
assert when.tzinfo is self
start, end = us_dst_range(when.year)
start = start.replace(tzinfo=self)
end = end.replace(tzinfo=self)
std_time = when + 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")
Σημειώστε ότι υπάρχουν αναπόφευκτες λεπτές περιπτώσεις δύο φορές το χρόνο σε μια υποκλάση tzinfo που λαμβάνει υπόψη τόσο την κανονική όσο και τη θερινή ώρα, στα σημεία μετάβασης DST. Για να είμαστε συγκεκριμένοι, σκεφτείτε την Ανατολική Ζώνη των ΗΠΑ (UTC -0500), όπου η EDT ξεκινά το λεπτό μετά τις 1:59 (EST) τη δεύτερη Κυριακή του Μαρτίου και τελειώνει το λεπτό μετά τις 1:59 (EDT) την πρώτη Κυριακή του Νοεμβρίου:
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
Όταν ξεκινάει το DST (η γραμμή «start»), το τοπικό ρολόι πηδάει από 1:59 σε 3:00. Μια τοπική ώρα της μορφής 2:MM δεν έχει νόημα σε αυτή την ημέρα, έτσι η astimezone(Eastern) δεν θα επιστρέψει αποτέλεσμα με hour == 2 την ημέρα που ξεκινάει το DST. Για παράδειγμα, κατά τον μετασχηματισμό Spring forward του 2016, παίρνουμε:
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.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
Όταν τελειώνει το DST (η γραμμή «end»), υπάρχει ένα δυνητικά χειρότερο πρόβλημα: υπάρχει μια ώρα που δεν μπορεί να γραφτεί με σαφήνεια στην τοπική ώρα: η τελευταία ώρα της θερινής ώρας. Στην Ανατολική ζώνη, αυτές είναι οι ώρες της μορφής 5:MM UTC την ημέρα που τελειώνει η θερινή ώρα. Το τοπικό ρολόι πηδάει από 1:59 (θερινή ώρα) πίσω σε 1:00 (κανονική ώρα) ξανά. Οι τοπικές ώρες της μορφής 1:MM είναι ασαφείς. Η astimezone() μιμείται τη συμπεριφορά του τοπικού ρολογιού χαρτογραφώντας δύο γειτονικές ώρες UTC στην ίδια τοπική ώρα τότε. Στο παράδειγμα της Ανατολής, οι ώρες UTC της μορφής 5:MM και 6:MM χαρτογραφούνται και οι δύο σε 1:MM όταν μετατραπούν σε Ανατολική, αλλά οι προηγούμενες ώρες έχουν την ιδιότητα fold ρυθμισμένη σε 0 και οι μεταγενέστερες ώρες έχουν ρυθμισμένη σε 1. Για παράδειγμα, κατά τη μετάβαση Fall back του 2016, παίρνουμε:
>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.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
Σημειώστε ότι τα στιγμιότυπα της datetime όπου διαφέρουν μόνο από την τιμή του χαρακτηριστικού fold θεωρούνται ίσα στις συγκρίσεις.
Applications that can’t bear wall-time ambiguities should explicitly check the
value of the fold attribute or avoid using hybrid
tzinfo subclasses; there are no ambiguities when using timezone,
or any other fixed-offset tzinfo subclass (such as a class representing
only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)).
Δείτε επίσης
zoneinfoΤο module
datetimeέχει μια βασική κλάσηtimezone(για τη διαχείριση αυθαίρετων σταθερών αποκλίσεων από το UTC) και το χαρακτηριστικό τουtimezone.utc(ένα στιγμιότυπο UTC τηςtimezone).Το
zoneinfoφέρνει τη βάση δεδομένων ζωνών ώρας IANA (γνωστή και ως βάση δεδομένων Olson) στην Python, και η χρήση της συνιστάται.
- IANA time zone database
Η Βάση Δεδομένων Ζωνών Ώρας (συχνά αποκαλείται tz, tzdata ή zoneinfo) περιέχει κώδικα και δεδομένα που αντιπροσωπεύουν την ιστορία της τοπικής ώρας για πολλές αντιπροσωπευτικές τοποθεσίες σε όλο τον κόσμο. Ενημερώνεται περιοδικά ώστε να αντικατοπτρίζει τις αλλαγές που γίνονται από πολιτικούς φορείς στα όρια των ζωνών ώρας, στις αποκλίσεις UTC και στους κανόνες θερινής ώρας.
timezone objects¶
Η κλάση timezone είναι μια υποκλάση της tzinfo, κάθε στιγμιότυπο της οποίας αντιπροσωπεύει μια ζώνη ώρας που ορίζεται από μια σταθερή μετατόπιση από το UTC.
Αντικείμενα αυτής της κλάσης δεν μπορούν να χρησιμοποιηθούν για να αναπαραστήσουν πληροφορίες ζώνης ώρας στις τοποθεσίες όπου χρησιμοποιούνται διαφορετικές μετατοπίσεις σε διαφορετικές ημέρες του έτους ή όπου έχουν γίνει ιστορικές αλλαγές στην πολιτική ώρα.
- class datetime.timezone(offset, name=None)¶
Το όρισμα offset πρέπει να καθοριστεί ως ένα αντικείμενο
timedeltaπου αντιπροσωπεύει τη διαφορά μεταξύ της τοπικής ώρας και του UTC. Πρέπει να είναι αυστηρά μεταξύ-timedelta(hours=24)καιtimedelta(hours=24), διαφορετικά θα γίνει raise μιαValueError.Το όρισμα name είναι προαιρετικό. Εάν καθοριστεί, πρέπει να είναι μια συμβολοσειρά που θα χρησιμοποιηθεί ως η τιμή που επιστρέφεται από τη μέθοδο
datetime.tzname().Added in version 3.2.
Άλλαξε στην έκδοση 3.7: Η απόκλιση UTC δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- timezone.utcoffset(dt)¶
Επιστρέφει την σταθερή τιμή που καθορίστηκε κατά τη δημιουργία του στιγμιότυπου
timezone.Το όρισμα dt αγνοείται. Η επιστρεφόμενη τιμή είναι ένα στιγμιότυπο της
timedeltaπου είναι ίσο με τη διαφορά μεταξύ της τοπικής ώρας και του UTC.Άλλαξε στην έκδοση 3.7: Η απόκλιση UTC δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
- timezone.tzname(dt)¶
Επιστρέφει την σταθερή τιμή που καθορίστηκε κατά τη δημιουργία του στιγμιότυπου
timezone.Εάν το name δεν παρέχεται στον κατασκευαστή, το όνομα που επιστρέφεται από
tzname(dt)παράγεται από την τιμή τουoffsetως εξής. Εάν το offset είναιtimedelta(0), το όνομα είναι «UTC», διαφορετικά είναι μια συμβολοσειρά στη μορφήUTC±HH:MM, όπου ± είναι το πρόσημο τουoffset, HH και MM είναι δύο ψηφία τουoffset.hoursκαιoffset.minutesαντίστοιχα.Άλλαξε στην έκδοση 3.6: Το όνομα που παράγεται από
offset=timedelta(0)είναι τώρα απλώς'UTC', όχι'UTC+00:00'.
- timezone.dst(dt)¶
Πάντα επιστρέφει
None.
- timezone.fromutc(dt)¶
Επιστρέφει
dt + offset. Το όρισμα dt πρέπει να είναι ένα συνειδητό στιγμιότυποdatetime, με τοtzinfoνα έχει οριστεί σεself.
Χαρακτηριστικά Κλάσης:
- timezone.utc¶
Η ζώνη ώρας UTC,
timezone(timedelta(0)).
strftime() and strptime() behavior¶
Τα αντικείμενα date, datetime και time υποστηρίζουν όλα μια μέθοδο strftime(format), για να δημιουργήσουν μια συμβολοσειρά που αντιπροσωπεύει την ώρα υπό τον έλεγχο μιας ρητής μορφής συμβολοσειράς.
Αντίστροφα, οι μέθοδοι κλάσης date.strptime(), datetime.strptime() και time.strptime() δημιουργούν ένα αντικείμενο από μια συμβολοσειρά που αντιπροσωπεύει την ώρα και μια αντίστοιχη μορφή συμβολοσειράς.
Ο παρακάτω πίνακας παρέχει μια γενική σύγκριση μεταξύ της strftime() και της strptime():
|
|
|
|---|---|---|
Χρήση |
Μετατροπή αντικειμένου σε συμβολοσειρά σύμφωνα με μια δεδομένη μορφή |
Ανάλυση μιας συμβολοσειράς σε ένα αντικείμενο δεδομένης μορφής |
Τύπος μεθόδου |
Μέθοδος στιγμής |
Μέθοδος κλάσης |
Υπογραφή |
|
|
strftime() and strptime() format codes¶
Αυτές οι μέθοδοι δέχονται κωδικούς μορφής που μπορούν να χρησιμοποιηθούν για την ανάλυση και τη μορφοποίηση ημερομηνιών:
>>> import datetime as dt
>>> dt.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'
Η ακόλουθη είναι μια λίστα με όλους τους κωδικούς μορφής που απαιτεί το πρότυπο C του 1989, και αυτοί λειτουργούν σε όλες τις πλατφόρμες με μια τυπική υλοποίηση C.
Οδηγία |
Σημασία |
Παράδειγμα |
Σημειώσεις |
|---|---|---|---|
|
Ημέρα της εβδομάδας ως τοπική συντομογραφία. |
Sun, Mon, …, Sat
(en_US);
So, Mo, …, Sa
(de_DE)
|
(1) |
|
Ημέρα της εβδομάδας ως τοπική πλήρης ονομασία. |
Sunday, Monday, …,
Saturday (en_US);
Sonntag, Montag, …,
Samstag (de_DE)
|
(1) |
|
Η ημέρα της εβδομάδας ως δεκαδικός αριθμός, όπου 0 είναι η Κυριακή και 6 είναι το Σάββατο. |
0, 1, …, 6 |
|
|
Ημέρα του μήνα ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
01, 02, …, 31 |
(9) |
|
Μήνας ως τοπική συντομογραφία. |
Jan, Feb, …, Dec
(en_US);
Jan, Feb, …, Dez
(de_DE)
|
(1) |
|
Μήνας ως τοπική πλήρης ονομασία. |
January, February,
…, December (en_US);
Januar, Februar, …,
Dezember (de_DE)
|
(1) |
|
Μήνας ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
01, 02, …, 12 |
(9) |
|
Έτος χωρίς αιώνα ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
00, 01, …, 99 |
(9) |
|
Έτος με αιώνα ως δεκαδικός αριθμός. |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(2) |
|
Ώρα (24-ωρο ρολόι) ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
00, 01, …, 23 |
(9) |
|
Η ώρα (σε μορφή 12-ωρού) ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
01, 02, …, 12 |
(9) |
|
Τοπικά ισοδύναμο είτε του AM είτε του PM. |
AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
|
Λεπτό ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
00, 01, …, 59 |
(9) |
|
Δευτερόλεπτο ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
00, 01, …, 59 |
(4), (9) |
|
Μικροδευτερόλεπτο ως δεκαδικό νούμερο, μηδενικά-γεμισμένο σε 6 ψηφία. |
000000, 000001, …, 999999 |
(5) |
|
Διαφορά UTC σε μορφή |
(empty), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
Όνομα ζώνης ώρας (κενή συμβολοσειρά αν το αντικείμενο είναι αδαές). |
(κενό), UTC, GMT |
(6) |
|
Ημέρα του έτους ως μηδενικά-γεμισμένο δεκαδικό νούμερο. |
001, 002, …, 366 |
(9) |
|
Αριθμός εβδομάδας του έτους (Κυριακή ως την πρώτη ημέρα της εβδομάδας) ως μηδενικά-γεμισμένο δεκαδικό νούμερο. Όλες οι ημέρες σε ένα νέο έτος που προηγούνται της πρώτης Κυριακής θεωρούνται ότι είναι στην εβδομάδα 0. |
00, 01, …, 53 |
(7), (9) |
|
Αριθμός εβδομάδας του έτους (Δευτέρα ως την πρώτη ημέρα της εβδομάδας) ως μηδενικά-γεμισμένο δεκαδικό νούμερο. Όλες οι ημέρες σε ένα νέο έτος που προηγούνται της πρώτης Δευτέρας θεωρούνται ότι είναι στην εβδομάδα 0. |
00, 01, …, 53 |
(7), (9) |
|
Το τοπικά κατάλληλο για την αναπαράσταση ημερομηνίας και ώρας. |
Tue Aug 16 21:30:00
1988 (en_US);
Di 16 Aug 21:30:00
1988 (de_DE)
|
(1) |
|
Το τοπικά κατάλληλο για την αναπαράσταση ημερομηνίας. |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
Το τοπικά κατάλληλο για την αναπαράσταση ώρας. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
Ένας literal χαρακτήρας |
% |
Ορισμένες επιπλέον οδηγίες που δεν απαιτούνται από το πρότυπο C89 περιλαμβάνονται για λόγους ευκολίας. Αυτές οι παράμετροι αντιστοιχούν όλες σε τιμές ημερομηνίας ISO 8601.
Οδηγία |
Σημασία |
Παράδειγμα |
Σημειώσεις |
|---|---|---|---|
|
ISO 8601 έτος με αιώνα που αντιπροσωπεύει το έτος που περιέχει το μεγαλύτερο μέρος της ISO εβδομάδας ( |
0001, 0002, …, 2013, 2014, …, 9998, 9999 |
(8) |
|
ISO 8601 ημέρα της εβδομάδας ως δεκαδικό νούμερο όπου 1 είναι η Δευτέρα. |
1, 2, …, 7 |
|
|
ISO 8601 βδομάδα ως δεκαδικό νούμερο με τη Δευτέρα ως την πρώτη μέρα της εβδομάδας. Η εβδομάδα 01 είναι η εβδομάδα που περιέχει την 4η Ιανουαρίου. |
01, 02, …, 53 |
(8), (9) |
|
UTC διαφορά σε μορφή |
(empty), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216 |
(6) |
Αυτές οι παράμετροι ενδέχεται να μην είναι διαθέσιμες σε όλες τις πλατφόρμες όταν χρησιμοποιούνται με τη μέθοδο strftime(). Οι οδηγίες ISO 8601 έτους και ISO 8601 εβδομάδας δεν είναι εναλλάξιμες με τις παραπάνω οδηγίες έτους και αριθμού εβδομάδας. Η κλήση της strptime() με ατελείς ή ασαφείς οδηγίες ISO 8601 θα προκαλέσει την εμφάνιση μιας ValueError.
Το πλήρες σύνολο των κωδικών μορφοποίησης που υποστηρίζονται διαφέρει μεταξύ των πλατφορμών, επειδή η Python καλεί τη λειτουργία strftime() της βιβλιοθήκης C της πλατφόρμας, και οι παραλλαγές πλατφόρμας είναι συχνές. Για να δείτε το πλήρες σύνολο των κωδικών μορφοποίησης που υποστηρίζονται στην πλατφόρμα σας, συμβουλευτείτε την τεκμηρίωση strftime(3). Υπάρχουν επίσης διαφορές μεταξύ των πλατφορμών στην επεξεργασία μη υποστηριζόμενων προδιαγραφών μορφοποίησης.
Added in version 3.6: %G, %u και %V προστέθηκαν.
Added in version 3.12: %:z προστέθηκε.
Technical detail¶
Σε γενικές γραμμές, το d.strftime(fmt) λειτουργεί όπως το time.strftime(fmt, d.timetuple()) του module time αν και, δεν υποστηρίζουν όλα τα αντικείμενα μια μέθοδο timetuple().
For the datetime.strptime() and date.strptime() class methods,
the default value is 1900-01-01T00:00:00.000: any components not specified
in the format string will be pulled from the default value.
Σημείωση
Format strings without separators can be ambiguous for parsing. For
example, with %Y%m%d, the string 2026111 may be parsed either as
2026-11-01 or as 2026-01-11.
Use separators to ensure the input is parsed as intended.
Σημείωση
When used to parse partial dates lacking a year, datetime.strptime()
and date.strptime() will raise when encountering February 29 because
the default year of 1900 is not a leap year. Always add a default leap
year to partial date strings before parsing.
>>> import datetime as dt
>>> value = "2/29"
>>> dt.datetime.strptime(value, "%m/%d")
Traceback (most recent call last):
...
ValueError: day 29 must be in range 1..28 for month 2 in year 1900
>>> dt.datetime.strptime(f"1904 {value}", "%Y %m/%d")
datetime.datetime(1904, 2, 29, 0, 0)
Η χρήση του datetime.strptime(date_string, format) είναι ισοδύναμη με:
datetime(*(time.strptime(date_string, format)[0:6]))
εκτός αν η μορφή περιλαμβάνει υπο-δευτερόλεπτα ή πληροφορίες ζώνης ώρας, οι οποίες υποστηρίζονται στο datetime.strptime αλλά απορρίπτονται από το time.strptime.
Για τα αντικείμενα time, οι κωδικοί μορφοποίησης για το έτος, τον μήνα και την ημέρα δεν πρέπει να χρησιμοποιούνται, καθώς τα αντικείμενα time δεν έχουν τέτοιες τιμές. Εάν χρησιμοποιηθούν ούτως ή άλλως, το έτος αντικαθίσταται με το 1900, και ο μήνας και η ημέρα με το 1.
Για date αντικείμενα, οι κωδικοί μορφοποίησης για τις ώρες, τα λεπτά, τα δευτερόλεπτα και τα μικροδευτερόλεπτα δεν πρέπει να χρησιμοποιούνται, καθώς τα αντικείμενα date δεν έχουν τέτοιες τιμές. Εάν χρησιμοποιηθούν ούτως ή άλλως, το 0 το αντικαθιστά.
Για τον ίδιο λόγο, η επεξεργασία συμβολοσειρών μορφοποίησης που περιέχουν σημεία κώδικα Unicode που δεν μπορούν να αναπαρασταθούν στο charset της τρέχουσας τοποθεσίας είναι επίσης εξαρτώμενη από την πλατφόρμα. Σε ορισμένες πλατφόρμες, τέτοια σημεία κώδικα διατηρούνται άθικτα στην έξοδο, ενώ σε άλλες το strftime μπορεί να κάνει raise μια UnicodeError ή να επιστρέψει μια κενή συμβολοσειρά.
Σημειώσεις:
Επειδή η μορφή εξαρτάται από την τρέχουσα τοποθεσία, θα πρέπει να προσέχετε όταν κάνετε υποθέσεις σχετικά με την τιμή εξόδου. Οι διατάξεις πεδίων θα διαφέρουν (για παράδειγμα, «μήνας/ημέρα/έτος» σε σύγκριση με «ημέρα/μήνας/έτος»), και η έξοδος μπορεί να περιέχει μη-ASCII χαρακτήρες.
Η μέθοδος
strptime()μπορεί να αναλύσει έτη στο πλήρες εύρος [1, 9999], αλλά τα έτη < 1000 πρέπει να είναι μηδενικά γεμισμένα σε πλάτος 4 ψηφίων.Άλλαξε στην έκδοση 3.2: Σε προηγούμενες εκδόσεις, η μέθοδος
strftime()περιορίζεται σε έτη >= 1900.Άλλαξε στην έκδοση 3.3: Στην έκδοση 3.2, η μέθοδος
strftime()περιορίζεται σε έτη >= 1000.Όταν χρησιμοποιείται με τη μέθοδο
strptime(), η οδηγία%pεπηρεάζει μόνο το πεδίο εξόδου ώρας εάν η οδηγία%Iχρησιμοποιείται για να αναλύσει την ώρα.Σε αντίθεση με το
time, τοdatetimeδεν υποστηρίζει δευτερόλεπτα άλματος (leap seconds).Όταν χρησιμοποιείται με τη μέθοδο
strptime(), η οδηγία%fαποδέχεται από ένα έως έξι ψηφία και γεμίζει με μηδενικά στα δεξιά. Η Η%fείναι μια επέκταση του συνόλου χαρακτήρων μορφοποίησης στο C standard (αλλά υλοποιημένη χωριστά σε αντικείμενα datetime, και επομένως πάντα διαθέσιμη).Για ένα αδαές αντικείμενο, οι κωδικοί μορφοποίησης
%z,%:zκαι%Zαντικαθίστονται με κενές συμβολοσειρές.Για ένα ενήμερο αντικείμενο:
%zΗ
utcoffset()μετατρέπεται σε μια συμβολοσειρά της μορφής±HHMM[SS[.ffffff]], όπουHHείναι μια 2-ψήφια συμβολοσειρά που δίνει τον αριθμό των ωρών διαφοράς UTC,MMείναι μια 2-ψήφια συμβολοσειρά που δίνει τον αριθμό των λεπτών διαφοράς UTC,SSείναι μια 2-ψήφια συμβολοσειρά που δίνει τον αριθμό των δευτερολέπτων διαφοράς UTC καιffffffείναι μια 6-ψήφια συμβολοσειρά που δίνει τον αριθμό των μικροδευτερολέπτων διαφοράς UTC. Το τμήμαffffffπαραλείπεται όταν η διαφορά είναι ένας ακέραιος αριθμός δευτερολέπτων και τόσο το τμήμαffffffόσο και το τμήμαSSπαραλείπονται όταν η διαφορά είναι ένας ακέραιος αριθμός λεπτών. Για παράδειγμα, εάν ηutcoffset()επιστρέψειtimedelta(hours=-3, minutes=-30), το%zαντικαθίσταται με τη συμβολοσειρά'-0330'.
Άλλαξε στην έκδοση 3.7: Η απόκλιση UTC δεν περιορίζεται σε ακέραιο αριθμό λεπτών.
Άλλαξε στην έκδοση 3.7: Όταν η οδηγία
%zπαρέχεται στη μέθοδοstrptime(), οι διαφορές UTC μπορούν να έχουν μια άνω κάτω τελεία ως διαχωριστικό μεταξύ ωρών, λεπτών και δευτερολέπτων. Για παράδειγμα, το'+01:00:00'θα αναλυθεί ως μια διαφορά μίας ώρας. Επιπλέον, η παροχή'Z'είναι ταυτόσημη με'+00:00'.%:zΣυμπεριφέρεται ακριβώς ως
%z, αλλά έχει μια άνω κάτω τελεία ως διαχωριστικό μεταξύ ωρών, λεπτών και δευτερολέπτων.%ZΣτην
strftime(), το%Zαντικαθίσταται με μια κενή συμβολοσειρά αν ηtzname()επιστρέψειNone· διαφορετικά το%Zαντικαθίσταται με την επιστρεφόμενη τιμή, η οποία πρέπει να είναι μια συμβολοσειρά.Η
strptime()δέχεται μόνο συγκεκριμένες τιμές για το%Z:οποιαδήποτε τιμή στο
time.tznameγια την τοποθεσία του μηχανήματός σαςοι σταθερές τιμές
UTCκαιGMT
Έτσι, κάποιος που ζει στην Ιαπωνία μπορεί να έχει
JST,UTCκαιGMTως έγκυρες τιμές, αλλά πιθανότατα όχιEST. Θα γίνει raiseValueErrorγια μη έγκυρες τιμές.
Άλλαξε στην έκδοση 3.2: Όταν η οδηγία
%zπαρέχεται στη μέθοδοstrptime(), ένα αντικείμενοdatetimeμε γνώση ζώνης θα παραχθεί. Τοtzinfoτου αποτελέσματος θα ρυθμιστεί σε μιαtimezoneπαρουσία.Όταν χρησιμοποιείται με τη μέθοδο
strptime(), το%Uκαι το%Wχρησιμοποιούνται μόνο σε υπολογισμούς όταν η ημέρα της εβδομάδας και το ημερολογιακό έτος (%Y) είναι καθορισμένα.Παρόμοια με
%Uκαι%W, το%Vχρησιμοποιείται μόνο σε υπολογισμούς όταν η ημέρα της εβδομάδας και το ISO έτος (%G) είναι καθορισμένα σε μια συμβολοσειρά μορφήςstrptime(). Σημειώστε επίσης ότι%Gκαι%Yδεν είναι ανταλλάξιμα.Όταν χρησιμοποιείται με τη μέθοδο
strptime(), το μηδενικό ψηφίο μπροστά είναι προαιρετικό για τις μορφές%d,%m,%H,%I,%M,%S,%j,%U,%Wκαι%V. Η μορφή%yαπαιτεί μπροστά μηδενικό ψηφίο.When parsing a month and day using
strptime(), always include a year in the format. If the value you need to parse lacks a year, append an explicit dummy leap year. Otherwise your code will raise an exception when it encounters leap day because the default year used by the parser (1900) is not a leap year. Users run into that bug every leap year.>>> month_day = "02/29" >>> dt.datetime.strptime(f"{month_day};1984", "%m/%d;%Y") # No leap year bug. datetime.datetime(1984, 2, 29, 0, 0)
Καταργήθηκε από την έκδοση 3.13, θα αφαιρεθεί στην έκδοση 3.15: Κλήσεις της
strptime()με format string που περιέχει ημέρα του μήνα χωρίς έτος εμφανίζουν πλέονDeprecationWarning. Στην έκδοση 3.15 ή μεταγενέστερη αυτό μπορεί να μετατραπεί σε σφάλμα ή να αλλάξει το προεπιλεγμένο έτος σε δίσεκτο. Δείτε gh-70647.
Υποσημειώσεις