zoneinfo — Υποστήριξη ζωνών ώρας IANA¶
Added in version 3.9.
Πηγαίος κώδικας: Lib/zoneinfo
The zoneinfo module provides a concrete time zone implementation to
support the IANA time zone database as originally specified in PEP 615. By
default, zoneinfo uses the system’s time zone data if available; if no
system time zone data is available, the library will fall back to using the
first-party tzdata package available on PyPI.
Δείτε επίσης
Διαθεσιμότητα: not WASI.
Αυτό το module δεν λειτουργεί ή δεν είναι διαθέσιμο στο WebAssembly. Δείτε το WebAssembly platforms για περισσότερες πληροφορίες.
Χρήση του ZoneInfo¶
Το ZoneInfo είναι μια συγκεκριμένη υλοποίηση της αφηρημένης βασικής κλάσης datetime.tzinfo, και προορίζεται να συνδεθεί με το tzinfo, είτε μέσω του κατασκευαστή, της μεθόδου datetime.replace ή της datetime.astimezone:
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'
Οι ημερομηνίες και ώρες που κατασκευάζονται με αυτόν τον τρόπο είναι συμβατές με αριθμητικές πράξεις ημερομηνίας και ώρας και χειρίζονται τις μεταβάσεις θερινής ώρας χωρίς περαιτέρω παρέμβαση:
>>> when_add = when + dt.timedelta(days=1)
>>> print(when_add)
2020-11-01 12:00:00-08:00
>>> when_add.tzname()
'PST'
Αυτές οι ζώνες ώρας υποστηρίζουν επίσης το χαρακτηριστικό fold που εισήχθη στο PEP 495. Κατά τις μεταβάσεις μετατόπισης που προκαλούν αμφίσημες ώρες (όπως μια μετάβαση από τη θερινή ώρα στη χειμερινή ώρα), η μετατόπιση από πριν τη μετάβαση χρησιμοποιείται όταν fold=0, και η μετατόπιση μετά τη μετάβαση χρησιμοποιείται όταν fold=1, για παράδειγμα:
>>> when = dt.datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-11-01 01:00:00-07:00
>>> print(when.replace(fold=1))
2020-11-01 01:00:00-08:00
Κατά τη μετατροπή από άλλη ζώνη ώρας, το fold θα οριστεί στην σωστή τιμή:
>>> LOS_ANGELES = ZoneInfo("America/Los_Angeles")
>>> when_utc = dt.datetime(2020, 11, 1, 8, tzinfo=dt.timezone.utc)
>>> # Before the PDT -> PST transition
>>> print(when_utc.astimezone(LOS_ANGELES))
2020-11-01 01:00:00-07:00
>>> # After the PDT -> PST transition
>>> print((when_utc + dt.timedelta(hours=1)).astimezone(LOS_ANGELES))
2020-11-01 01:00:00-08:00
Πηγές δεδομένων¶
Το module zoneinfo δεν παρέχει άμεσα δεδομένα ζώνης ώρας, και αντ” αυτού αντλεί πληροφορίες ζώνης ώρας από τη βάση δεδομένων ζώνης ώρας του συστήματος ή από το πακέτο πρώτου μέρους του PyPI tzdata, αν είναι διαθέσιμο. Ορισμένα συστήματα, συμπεριλαμβανομένων ενδεικτικά των συστημάτων Windows, δεν διαθέτουν βάση δεδομένων IANA, και έτσι για έργα που στοχεύουν στη διαλειτουργικότητα μεταξύ πλατφορμών και απαιτούν δεδομένα ζώνης ώρας, συνιστάται να δηλωθεί μια εξάρτηση στο tzdata. Εάν δεν είναι διαθέσιμα ούτε τα δεδομένα συστήματος ούτε το tzdata, όλες οι κλήσεις στο ZoneInfo θα κάνουν raise το ZoneInfoNotFoundError.
Διαμόρφωση των πηγών δεδομένων¶
Όταν καλείται το ZoneInfo(key), ο κατασκευαστής αναζητά πρώτα στους καταλόγους που καθορίζονται στο TZPATH για ένα αρχείο που ταιριάζει με το key, και σε περίπτωση αποτυχίας αναζητά μια αντιστοιχία στο πακέτο tzdata. Αυτή η συμπεριφορά μπορεί να διαμορφωθεί με τρεις τρόπους:
Όταν η προεπιλεγμένη
TZPATHδεν καθορίζεται διαφορετικά, μπορεί να διαμορφωθεί κατά το compile time.Το
TZPATHμπορεί να διαμορφωθεί χρησιμοποιώντας μια μεταβλητή περιβάλλοντος.Κατά το runtime, η διαδρομή αναζήτησης μπορεί να χειριστεί χρησιμοποιώντας τη συνάρτηση
reset_tzpath().
Διαμόρφωση κατά το compile-time¶
Η προεπιλεγμένη TZPATH περιλαμβάνει αρκετές κοινές τοποθεσίες ανάπτυξης για τη βάση δεδομένων ζώνης ώρας (εκτός από τα Windows, όπου δεν υπάρχουν «γνωστές» τοποθεσίες για δεδομένα ζώνης ώρας). Σε συστήματα POSIX, οι διανομείς κατεβάσματος και αυτοί που γράφουν Python από πηγαίο κώδικα που γνωρίζουν πού είναι αναπτυγμένα τα δεδομένα ζώνης ώρας του συστήματός τους μπορούν να αλλάξουν την προεπιλεγμένη διαδρομή ζώνης ώρας καθορίζοντας την επιλογή κατά το compile-time TZPATH (ή, πιο πιθανώς, το configure flag --with-tzpath), το οποίο πρέπει να είναι μια συμβολοσειρά διαχωρισμένη από os.pathsep.
Σε όλες τις πλατφόρμες, η διαμορφωμένη τιμή είναι διαθέσιμη ως το κλειδί TZPATH στη sysconfig.get_config_var().
Διαμόρφωση περιβάλλοντος¶
Κατά την αρχικοποίηση του TZPATH (είτε κατά το χρόνο εισαγωγής είτε όποτε καλείται η reset_tzpath() χωρίς ορίσματα), το module zoneinfo θα χρησιμοποιήσει τη μεταβλητή περιβάλλοντος PYTHONTZPATH, αν υπάρχει, για να ορίσει τη διαδρομή αναζήτησης.
- PYTHONTZPATH¶
Αυτή είναι μια συμβολοσειρά διαχωρισμένη από το
os.pathsepπου περιέχει τη διαδρομή αναζήτησης ζώνης ώρας προς χρήση. Πρέπει να αποτελείται μόνο από απόλυτες και όχι σχετικές διαδρομές. Σχετικά στοιχεία που καθορίζονται στοPYTHONTZPATHδεν θα χρησιμοποιηθούν, αλλά διαφορετικά η συμπεριφορά όταν καθορίζεται μια σχετική διαδρομή είναι ορισμένη από την υλοποίηση· η CPython θα κάνει raise τηνInvalidTZPathWarning, αλλά άλλες υλοποιήσεις είναι ελεύθερες να αγνοήσουν σιωπηλά το λανθασμένο στοιχείο ή να κάνουν raise μια εξαίρεση.
Για να ρυθμίσετε το σύστημα να αγνοεί τα δεδομένα συστήματος και να χρησιμοποιεί αντ” αυτού το πακέτο tzdata, ορίστε PYTHONTZPATH="".
Διαμόρφωση κατά το runtime¶
Η διαδρομή αναζήτησης TZ μπορεί επίσης να διαμορφωθεί κατά το runtime χρησιμοποιώντας τη συνάρτηση reset_tzpath(). Αυτή δεν είναι γενικά μια συνιστώμενη λειτουργία, αν και είναι λογικό να τη χρησιμοποιήσετε σε συναρτήσεις δοκιμών που απαιτούν τη χρήση μιας συγκεκριμένης διαδρομής ζώνης ώρας (ή απαιτούν την απενεργοποίηση της πρόσβασης στις ζώνες ώρας συστήματος).
Η κλάση ZoneInfo¶
- class zoneinfo.ZoneInfo(key)¶
Μια συγκεκριμένη υποκλάση της
datetime.tzinfoπου αντιπροσωπεύει μια ζώνη ώρας IANA που καθορίζεται από τη συμβολοσειράkey. Οι κλήσεις στον κύριο κατασκευαστή θα επιστρέφουν πάντα αντικείμενα που συγκρίνονται ταυτόσημα· με άλλα λόγια, εκτός από την ακύρωση της προσωρινής μνήμης μέσω τηςZoneInfo.clear_cache(), για όλες τις τιμές τουkey, η ακόλουθη δήλωση θα είναι πάντα αληθής:a = ZoneInfo(key) b = ZoneInfo(key) assert a is b
Το
keyπρέπει να έχει τη μορφή σχετικής, κανονικοποιημένης διαδρομής POSIX, χωρίς αναφορές σε ανώτερα επίπεδα. Ο κατασκευαστής θα κάνει raise τοValueErrorαν περαστεί μη συμμορφούμενο κλειδί.Αν δεν βρεθεί αρχείο που να ταιριάζει με το
key, ο κατασκευαστής θα κάνει raise τοZoneInfoNotFoundError.
Τη κλάση ZoneInfo έχει δύο εναλλακτικούς κατασκευαστές:
- classmethod ZoneInfo.from_file(file_obj, /, key=None)¶
Κατασκευάζει ένα αντικείμενο
ZoneInfoαπό ένα αντικείμενο παρόμοιο με αρχείο που επιστρέφει bytes (π.χ. ένα αρχείο ανοιγμένο σε δυαδική λειτουργία ή ένα αντικείμενοio.BytesIO). Σε αντίθεση με τον κύριο κατασκευαστή, αυτό πάντα κατασκευάζει ένα νέο αντικείμενο.Η παράμετρος
keyορίζει το όνομα της ζώνης για τους σκοπούς των__str__()και__repr__().Τα αντικείμενα που δημιουργούνται μέσω αυτού του κατασκευαστή δεν μπορούν να σειριοποιηθούν (δείτε pickling).
ValueErroris raised if the data read from file_obj is not a valid TZif file.
- classmethod ZoneInfo.no_cache(key)¶
Ένας εναλλακτικός κατασκευαστής που παρακάμπτει την προσωρινή μνήμη του κατασκευαστή. Είναι πανομοιότυπος με τον κύριο κατασκευαστή, αλλά επιστρέφει ένα νέο αντικείμενο σε κάθε κλήση. Αυτό είναι πιο πιθανό να είναι χρήσιμο για σκοπούς δοκιμών ή επίδειξης, αλλά μπορεί επίσης να χρησιμοποιηθεί για τη δημιουργία ενός συστήματος με διαφορετική στρατηγική ακύρωσης της προσωρινής μνήμης.
Τα αντικείμενα που δημιουργούνται μέσω αυτού του κατασκευαστή θα παρακάμπτουν επίσης την προσωρινή μνήμη μιας διαδικασίας αποσειριοποίησης όταν αποσειριοποιούνται.
Προσοχή
Η χρήση αυτού του κατασκευαστή μπορεί να αλλάξει τα νοήματα των ημερομηνιών και ωρών σας με εκπληκτικούς τρόπους, χρησιμοποιήστε τον μόνο αν γνωρίζετε ότι το χρειάζεστε.
Οι ακόλουθες μέθοδοι κλάσης είναι επίσης διαθέσιμες:
- classmethod ZoneInfo.clear_cache(*, only_keys=None)¶
Μια μέθοδος για την ακύρωση της προσωρινής μνήμης στην κλάση
ZoneInfo. Αν δεν περαστούν τα ορίσματα, όλες οι προσωρινές μνήμες ακυρώνονται και η επόμενη κλήση στον κύριο κατασκευαστή για κάθε κλειδί θα επιστρέψει ένα νέο στιγμιότυπο.Αν περαστεί μια iterable συλλογή ονομάτων κλειδιών στην παράμετρο
only_keys, μόνο τα καθορισμένα κλειδιά θα αφαιρεθούν από την προσωρινή μνήμη. Τα κλειδιά που περάστηκαν στοonly_keysαλλά δεν βρέθηκαν στην προσωρινή μνήμη αγνοούνται.Προειδοποίηση
Η κλήση αυτής της συνάρτησης μπορεί να αλλάξει τα νοήματα των ημερομηνιών και ωρών που χρησιμοποιούν το
ZoneInfoμε εκπληκτικούς τρόπους· αυτό τροποποιεί την κατάσταση του module και έτσι μπορεί να έχει ευρείες επιπτώσεις. Χρησιμοποιήστε το μόνο αν γνωρίζετε ότι το χρειάζεστε.
Η κλάση έχει ένα χαρακτηριστικό:
- ZoneInfo.key¶
Αυτό είναι ένα attribute μόνο για ανάγνωση που επιστρέφει την τιμή του
keyπου περάστηκε στον κατασκευαστή, το οποίο θα πρέπει να είναι ένα κλειδί αναζήτησης στη βάση δεδομένων ζώνης ώρας IANA (π.χ.America/New_York,Europe/ParisήAsia/Tokyo).Για ζώνες που κατασκευάζονται από αρχείο χωρίς να καθοριστεί μια παράμετρος
key, θα οριστεί σεNone.Σημείωση
Αν και είναι μια κάπως κοινή πρακτική να τις εκθέτουν στους τελικούς χρήστες, αυτές οι τιμές έχουν σχεδιαστεί για να είναι πρωτεύοντα κλειδιά για την αναπαράσταση των σχετικών ζωνών και όχι απαραίτητα στοιχεία που απευθύνονται στον χρήστη. Έργα όπως το CLDR (το Unicode Common Locale Data Repository) μπορούν να χρησιμοποιηθούν για να λάβουν πιο φιλικές προς τον χρήστη συμβολοσειρές από αυτά τα κλειδιά.
Αναπαραστάσεις συμβολοσειρών¶
Η αναπαράσταση συμβολοσειράς που επιστρέφεται κατά την κλήση της str σε ένα αντικείμενο ZoneInfo προεπιλέγεται να χρησιμοποιεί το χαρακτηριστικό ZoneInfo.key (δείτε τη σημείωση σχετικά με τη χρήση στην τεκμηρίωση χαρακτηριστικών):
>>> zone = ZoneInfo("Pacific/Kwajalein")
>>> str(zone)
'Pacific/Kwajalein'
>>> when = dt.datetime(2020, 4, 1, 3, 15, tzinfo=zone)
>>> f"{when.isoformat()} [{when.tzinfo}]"
'2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]'
Για αντικείμενα που κατασκευάζονται από ένα αρχείο χωρίς να καθοριστεί μια παράμετρος key, το str επιστρέφει στην κλήση της repr(). Το repr του ZoneInfo είναι ορισμένο από την υλοποίηση και δεν είναι απαραίτητα σταθερό μεταξύ των εκδόσεων, αλλά εγγυάται ότι δεν θα είναι ένα έγκυρο κλειδί ZoneInfo.
Σειριοποίηση με pickle¶
Αντί να σειριοποιούν όλα τα δεδομένα μετάβασης, τα αντικείμενα ZoneInfo σειριοποιούνται κατά κλειδί, και τα αντικείμενα ZoneInfo που κατασκευάζονται από αρχεία (ακόμα και αυτά με μια καθορισμένη τιμή για το key) δεν μπορούν να σειριοποιηθούν με pickle.
Η συμπεριφορά ενός αρχείου ZoneInfo εξαρτάται από τον τρόπο με τον οποίο κατασκευάστηκε:
ZoneInfo(key): Όταν κατασκευάζεται με τον κύριο κατασκευαστή, ένα αντικείμενοZoneInfoσειριοποιείται κατά κλειδί, και όταν αποσειριοποιείται, η διαδικασία αποσειριοποίησης χρησιμοποιεί τον κύριο κατασκευαστή και έτσι αναμένεται ότι αυτά είναι το ίδιο αντικείμενο με άλλες αναφορές στην ίδια ζώνη ώρας. Για παράδειγμα, αν τοeurope_berlin_pklείναι μια συμβολοσειρά που περιέχει ένα pickle κατασκευασμένο απόZoneInfo("Europe/Berlin"), θα περίμενε κανείς την ακόλουθη συμπεριφορά:>>> a = ZoneInfo("Europe/Berlin") >>> b = pickle.loads(europe_berlin_pkl) >>> a is b True
ZoneInfo.no_cache(key): Όταν κατασκευάζεται από τον κατασκευαστή που παρακάμπτει την προσωρινή μνήμη, το αντικείμενοZoneInfoσειριοποιείται επίσης κατά κλειδί, αλλά όταν αποσειριοποιείται, η διαδικασία αποσειριοποίησης χρησιμοποιεί τον κατασκευαστή που παρακάμπτει την προσωρινή μνήμη. Αν τοeurope_berlin_pkl_ncείναι μια συμβολοσειρά που περιέχει ένα pickle κατασκευασμένο από τοZoneInfo.no_cache("Europe/Berlin"), θα περίμενε κανείς την ακόλουθη συμπεριφορά:>>> a = ZoneInfo("Europe/Berlin") >>> b = pickle.loads(europe_berlin_pkl_nc) >>> a is b False
ZoneInfo.from_file(file_obj, /, key=None): Όταν κατασκευάζεται από ένα αρχείο, το αντικείμενοZoneInfoκάνει raise μια εξαίρεση κατά τη σειριοποίηση με pickle. Αν ένας τελικός χρήστης θέλει να σειριοποιήσει με pickle έναZoneInfoπου κατασκευάζεται από ένα αρχείο, συνιστάται να χρησιμοποιήσει έναν τύπο περιτύλιξης ή μια προσαρμοσμένη συνάρτηση σειριοποίησης: είτε σειριοποιώντας κατά κλειδί, είτε αποθηκεύοντας τα περιεχόμενα του αντικειμένου του αρχείου και σειριοποιώντας αυτά.
Αυτή η μέθοδος σειριοποίησης απαιτεί τα δεδομένα ζώνης ώρας για το απαιτούμενο κλειδί να είναι διαθέσιμα τόσο στην πλευρά σειριοποίησης όσο και στην πλευρά αποσειριοποίησης, παρόμοια με τον τρόπο που αναμένεται να υπάρχουν αναφορές σε κλάσεις και συναρτήσεις, και στα περιβάλλοντα σειριοποίησης και αποσειριοποίησης. Σημαίνει επίσης ότι δεν δίνονται εγγυήσεις σχετικά με τη συνέπεια των αποτελεσμάτων κατά την αποσειριοποίηση ενός ZoneInfo που έχει σειριοποιηθεί με pickle σε ένα περιβάλλον με διαφορετική έκδοση των δεδομένων ζώνης ώρας.
Συναρτήσεις¶
- zoneinfo.available_timezones()¶
Λάβετε υπόψη σας ένα σύνολο που περιέχει όλα τα έγκυρα κλειδιά για τις ζώνες ώρας IANA που είναι διαθέσιμες οπουδήποτε στη διαδρομή ζώνης ώρας. Αυτό επαναϋπολογίζεται σε κάθε κλήση της συνάρτησης.
Αυτή η συνάρτηση περιλαμβάνει μόνο κανονικά ονόματα ζώνης και δεν περιλαμβάνει «ειδικές» ζώνες όπως αυτές κάτω από τους καταλόγους
posix/καιright/, ή τη ζώνηposixrules.Προσοχή
Αυτή η συνάρτηση μπορεί να ανοίξει μεγάλο αριθμό αρχείων, καθώς ο καλύτερος τρόπος για να προσδιοριστεί, αν ένα αρχείο στη διαδρομή ζώνης ώρας είναι μια έγκυρη ζώνη ώρας, είναι να διαβαστεί η «μαγική συμβολοσειρά» στην αρχή.
Σημείωση
Αυτές οι τιμές δεν έχουν σχεδιαστεί για να εκτίθενται στους τελικούς χρήστες· για στοιχεία που απευθύνονται στον χρήστη, οι εφαρμογές θα πρέπει να χρησιμοποιούν κάτι σαν το CLDR (το Unicode Common Locale Data Repository) για να λάβουν πιο φιλικές προς τον χρήστη συμβολοσειρές. Δείτε επίσης τη σημείωση προσοχής στο
ZoneInfo.key.
- zoneinfo.reset_tzpath(to=None)¶
Ορίζει ή επαναφέρει τη διαδρομή αναζήτησης ζώνης ώρας (
TZPATH) για το module. Όταν καλείται χωρίς ορίσματα, τοTZPATHορίζεται στην προεπιλεγμένη τιμή.Η κλήση του
reset_tzpathδεν θα ακυρώσει την προσωρινή μνήμη τηςZoneInfo, και έτσι οι κλήσεις στον κύριο κατασκευαστήZoneInfoθα χρησιμοποιούν τη νέαTZPATHμόνο σε περίπτωση απώλειας στην προσωρινή μνήμη.Η παράμετρος
toπρέπει να είναι μια sequence από συμβολοσειρές ήos.PathLikeκαι όχι μια συμβολοσειρά, όπου όλα πρέπει να είναι απόλυτες διαδρομές. Θα γίνει raise τοValueErrorαν περαστεί κάτι άλλο εκτός από μια απόλυτη διαδρομή.
Καθολικές μεταβλητές¶
- zoneinfo.TZPATH¶
Μια ακολουθία μόνο για ανάγνωση που αντιπροσωπεύει τη διαδρομή αναζήτησης ζώνης ώρας – κατά την κατασκευή ενός
ZoneInfoαπό ένα κλειδί, το κλειδί συνδέεται με κάθε καταχώριση στοTZPATH, και χρησιμοποιείται το πρώτο αρχείο που βρέθηκε.Το
TZPATHμπορεί να περιέχει μόνο απόλυτες διαδρομές, ποτέ σχετικές διαδρομές, ανεξάρτητα από το πώς διαμορφώνεται.Το αντικείμενο στο οποίο δείχνει το
zoneinfo.TZPATHμπορεί να αλλάξει σε απόκριση σε μια κλήση στηreset_tzpath(), οπότε συνιστάται να χρησιμοποιείτε τοzoneinfo.TZPATHαντί να εισάγετε τοTZPATHαπό τοzoneinfoή να αναθέτετε μια μακροχρόνια μεταβλητή στοzoneinfo.TZPATH.Για περισσότερες πληροφορίες σχετικά με τη διαμόρφωση της διαδρομής αναζήτησης ζώνης ώρας, δείτε Διαμόρφωση των πηγών δεδομένων.
Εξαιρέσεις και προειδοποιήσεις¶
- exception zoneinfo.ZoneInfoNotFoundError¶
Γίνεται raise όταν η κατασκευή ενός αντικειμένου
ZoneInfoαποτυγχάνει επειδή το καθορισμένο κλειδί δεν βρέθηκε στο σύστημα. Αυτή είναι μια υποκλάση τηςKeyError.
- exception zoneinfo.InvalidTZPathWarning¶
Γίνεται raise όταν η
PYTHONTZPATHπεριέχει ένα μη έγκυρο στοιχείο που θα φιλτραριστεί, όπως μια σχετική διαδρομή.