Μετατροπή συμβολοσειρών σε datetime στην Python

Εισαγωγή

Τα δεδομένα μπορούν να αναπαρασταθούν με διάφορες μορφές – και είναι ένας βολικός τρόπος αναπαράστασης ημερομηνιών και ωρών χορδές. Ωστόσο, για να εργαστούμε με αυτές τις ημερομηνίες και ώρες με αριθμητικό τρόπο (όπως υπολογισμός διαφορών ώρας, προσθήκη ή αφαίρεση ώρας κ.λπ.) – πρέπει να τις μετατρέψουμε σε datetime αντικείμενο.

Μία από τις πιο κοινές πηγές του ημερομηνίες με μορφή συμβολοσειράς είναι REST API που επιστρέφουν αγνωστικές συμβολοσειρές, τις οποίες μπορούμε στη συνέχεια να μετατρέψουμε σε άλλες μορφές.

Επιπλέον – οι ζώνες ώρας είναι ένας κοινός πονοκέφαλος όταν πρόκειται για την εργασία με αντικείμενα ημερομηνίας ώρας, επομένως θα πρέπει να το σκεφτούμε και κατά τη μετατροπή.

Σε αυτόν τον οδηγό – θα ρίξουμε μια ματιά στον τρόπο μετατροπής μιας ημερομηνίας/ώρας συμβολοσειράς σε α datetime αντικείμενο στην Python, χρησιμοποιώντας το ενσωματωμένο datetime module, αλλά και modules τρίτων όπως π.χ dateutil, arrow και Μάγια, λογιστικές ζώνες ώρας.

Μετατροπή συμβολοσειρών με χρήση ημερομηνίας ώρας

Η ημερομηνία Η ενότητα αποτελείται από τρεις διαφορετικούς τύπους αντικειμένων: date, time, να datetime. ο date το αντικείμενο περιέχει την ημερομηνία, time κρατάει το χρόνο, και datetime κρατάει και ημερομηνία και ώρα!

import datetime
print(f'Current date/time: {datetime.datetime.now()}')

Η εκτέλεση αυτού του κώδικα θα είχε ως αποτέλεσμα:

Current date/time: 2022-12-01 10:27:03.929149

Όταν δεν δίνεται προσαρμοσμένη μορφοποίηση, χρησιμοποιείται η προεπιλεγμένη μορφή συμβολοσειράς, δηλαδή η μορφή για "2022-12-01 10:27:03.929149" είναι σε ISO 8601 μορφή (ΕΕΕΕ-ΜΜ-ΗΗΗΩΩ:ΜΜ:ΔΣ.μμμμμ). Εάν η συμβολοσειρά εισόδου μας για να δημιουργήσουμε ένα datetime Το αντικείμενο είναι στην ίδια μορφή ISO 8601 ή εάν γνωρίζετε τη μορφή που θα λάβετε εκ των προτέρων, μπορούμε εύκολα να το αναλύσουμε σε datetime αντικείμενο:

import datetime

date_time_str = '2022-12-01 10:27:03.929149'

date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f')

print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)

Με την εκτέλεση του θα εκτυπωθούν η ημερομηνία, η ώρα και η ημερομηνία-ώρα:

Date: 2022-12-01
Time: 10:27:03.929149
Date-time: 2022-12-01 10:27:03.929149

Εδώ, χρησιμοποιούμε το strptime() μέθοδος, η οποία δέχεται δύο ορίσματα:

  • Η ημερομηνία με μορφοποίηση συμβολοσειράς
  • Η μορφή του πρώτου επιχειρήματος

Ο καθορισμός της μορφής όπως αυτή κάνει την ανάλυση πολύ πιο γρήγορη από τότε datetime δεν χρειάζεται να προσπαθήσει να ερμηνεύσει τη μορφή από μόνη της, η οποία είναι πολύ πιο ακριβή υπολογιστικά. Η τιμή επιστροφής είναι του τύπου datetime.

Στο παράδειγμά μας, "2022-12-01 10:27:03.929149" είναι η συμβολοσειρά εισόδου και "%Y-%m-%d %H:%M:%S.%f" είναι η μορφή της συμβολοσειράς ημερομηνίας μας. Το επιστρεφόμενο datetime Η τιμή αποθηκεύεται ως date_time_obj.

Δεδομένου ότι αυτό είναι α datetime αντικείμενο, μπορούμε να ονομάσουμε το date() και time() μεθόδους απευθείας σε αυτό. Όπως μπορείτε να δείτε από την έξοδο, εκτυπώνει το τμήμα «ημερομηνία» και «ώρα» της συμβολοσειράς εισόδου!

Μορφοποίηση διακριτικών

Αξίζει να αφιερώσετε λίγο χρόνο για να καταλάβετε μορφοποιήστε διακριτικά - ο "%Y-%m-%d %H:%M:%S.%f" από πριν.

Κάθε διακριτικό αντιπροσωπεύει ένα διαφορετικό μέρος της ημερομηνίας-ώρας, όπως ημέρα, μήνα, έτος, ημέρα του μήνα ή της εβδομάδας, κ.λπ. λίστα υποστηριζόμενων διακριτικών είναι αρκετά εκτεταμένο ώστε να επιτρέπει διάφορες μορφοποιήσεις. Μερικά από τα πιο συχνά χρησιμοποιούμενα, που έχουμε χρησιμοποιήσει επίσης νωρίτερα είναι:

  • %Y: Έτος (4 ψηφία)
  • %m: Μήνας
  • %d: Ημέρα του μήνα
  • %H: Ώρα (24 ώρες)
  • %M: Λεπτά
  • %S: Δευτερόλεπτα
  • %f: Μικροδευτερόλεπτα

Σημείωση: Όλα αυτά τα διακριτικά, εκτός από το έτος, αναμένεται να έχουν μηδενική επένδυση (δηλ. ο Αύγουστος είναι ο 8ος μήνας και έχει μηδενική επένδυση σε 08).

Χρήση διακριτικών μορφοποίησης strptime() για μετατροπή συμβολοσειράς σε διαφορετική μορφή ώρας ημερομηνίας

Εάν η μορφή μιας συμβολοσειράς είναι γνωστή, μπορεί εύκολα να αναλυθεί σε a datetime αντικείμενο χρησιμοποιώντας strptime(). Ας ρίξουμε μια ματιά σε ένα μη τετριμμένο παράδειγμα που μεταφράζεται από τη μια μορφή στην άλλη:

import datetime

date_time_str = 'Jul 17 2022 9:20AM'
date_time_obj = datetime.datetime.strptime(date_time_str, '%b %d %Y %I:%M%p')

print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)

Η συμβολοσειρά εισόδου ήταν μιας μορφής - "17 Ιουλίου 2022 9:20 π.μ.". Γνωρίζοντας αυτή τη μορφή, αντιστοιχίσαμε τα συστατικά στοιχεία στη μορφή ISO 8601 και τη μετατρέψαμε σε datetime αντικείμενο:

Date: 2022-07-17
Time: 09:20:00
Date-time: 2022-07-17 09:20:00

Ακολουθεί μια σύντομη λίστα κοινών ωρών ημερομηνίας με μορφοποίηση συμβολοσειρών και των αντίστοιχων μορφών τους strptime():

"Jun 28 2018 at 7:40AM" -> "%b %d %Y at %I:%M%p"
"September 18, 2017, 22:19:55" -> "%B %d, %Y, %H:%M:%S"
"Sun,05/12/99,12:30PM" -> "%a,%d/%m/%y,%I:%M%p"
"Mon, 21 March, 2015" -> "%a, %d %B, %Y"
"2018-03-12T10:12:45Z" -> "%Y-%m-%dT%H:%M:%SZ"

Μπορείτε να αναλύσετε μια συμβολοσειρά ημερομηνίας-ώρας οποιασδήποτε μορφής – αρκεί να χρησιμοποιείτε τη σωστή συμβολοσειρά διακριτικών μορφής για την είσοδο που λαμβάνετε.

Μετατροπή συμβολοσειράς σε ώρα ημερομηνίας με τις ζώνες ώρας

Ο χειρισμός των ημερομηνιών-ωρών γίνεται πιο περίπλοκος όταν ασχολείται με τις ζώνες ώρας. Όλα τα παραπάνω παραδείγματα μέχρι στιγμής είναι αφελή ως προς τη ζώνη ώρας. Αυτά είναι γνωστά ως αφελή αντικείμενα ημερομηνίας.

Ωστόσο, η datetime τα αντικείμενα περιέχουν ένα πεδίο ακριβώς για την αποθήκευση δεδομένων που σχετίζονται με τη ζώνη ώρας – tzinfo:

import datetime as dt
dtime = dt.datetime.now()

print(dtime) 
print(dtime.tzinfo) 

Η tzinfo πεδίο προορίζεται να είναι α datetime.timezone αντικείμενο, που δηλώνει τις πληροφορίες της ζώνης ώρας. Του None από προεπιλογή, και υποδηλώνει ότι το αντικείμενο ημερομηνίας ώρας είναι απλό στη ζώνη ώρας. Μια πολύ κοινή εξωτερική βιβλιοθήκη για το χειρισμό των ζωνών ώρας είναι pytz. Μπορείτε να ορίσετε PyTz αντικείμενα όπως το tzinfo πεδίο επίσης.

Εάν δεν το έχετε ήδη - εγκαταστήστε το μέσω:

$ pip install pytz

Χρησιμοποιώντας το PyTz, μπορούμε να δημιουργήσουμε μια άγκυρα για ώρες ημερομηνίας με επίγνωση της ζώνης ώρας, όπως το UTC:

import datetime as dt
import pytz

dtime = dt.datetime.now(pytz.utc)

print(dtime)
print(dtime.tzinfo)

Παραγωγή:

2022-12-01 02:07:41.960920+00:00
UTC

Δεν είναι πλέον 11 π.μ., αλλά 2 π.μ., γιατί έχουμε ορίσει τη ζώνη ώρας λίγες ώρες πριν! Αυτό αλλάζει τη ζώνη ώρας της ημερομηνίας ώρας.

+00:00 είναι η διαφορά μεταξύ της εμφανιζόμενης ώρας και της ώρας UTC ως παγκόσμιας άγκυρας συντονισμού. Έχουμε ορίσει την ώρα να είναι σε UTC, οπότε η μετατόπιση είναι 00:00. Αυτό είναι ένα αντικείμενο με επίγνωση ζώνης ώρας.

Ομοίως, μπορούμε να αλλάξουμε την ερμηνεία της ίδιας ημερομηνίας ώρας μεταξύ των ζωνών ώρας. Ας μετατρέψουμε μια συμβολοσειρά, όπως "2022-06-29 17:08:00" σε ώρα ημερομηνίας και στη συνέχεια περιορίζω στη ζώνη ώρας "America/New_York":

import datetime as dt
import pytz

date_time_str = '2022-06-29 17:08:00'
date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S')

timezone = pytz.timezone('America/New_York')
timezone_date_time_obj = timezone.localize(date_time_obj)

print(timezone_date_time_obj)
print(timezone_date_time_obj.tzinfo)

Σημείωση: Τοπική Προσαρμογή μετατρέπει μια απλή ημερομηνία ημερομηνίας ζώνης ώρας σε ώρα ημερομηνίας με επίγνωση της ζώνης ώρας και αντιμετωπίζει τη ζώνη ώρας ως τοπική. Έτσι, το Η ημερομηνία ημερομηνίας παραμένει η ίδια, αλλά δεδομένης της διαφορετικής ζώνης ώρας, δεν αντιπροσωπεύει πλέον το ίδιο χρονικό σημείο χωρίς περιορισμούς από τις ζώνες ώρας.

Παίρνουμε το ίδιο τιμή ημερομηνίας, αντισταθμίζεται από -04: 00 σε σύγκριση με την ώρα UTC:

2022-06-29 17:08:00-04:00
America/New_York

17:08 στο Τόκιο δεν είναι την ίδια χρονική στιγμή με τις 17:08 στη Νέα Υόρκη. 17:08 στο Τόκιο είναι 3:08 στη Νέα Υόρκη.

Πώς να βρείτε όλους τους κωδικούς/ψευδώνυμα ζώνης ώρας;

Για να βρείτε όλες τις διαθέσιμες ζώνες ώρας, επιθεωρήστε το all_timezones πεδίο, το οποίο είναι μια λίστα με όλες τις διαθέσιμες ζώνες ώρας:

print(f'There are {len(pytz.all_timezones)} timezones in PyTzn')
for time_zone in pytz.all_timezones:
   print(time_zone)

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

There are 594 timezones in PyTz

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
...

Αλλάξτε τη ζώνη ώρας της ημερομηνίας

Μπορούμε να μετατρέψουμε τη ζώνη ώρας σε μια ζώνη ώρας με επίγνωση datetime αντικείμενο από τη μια περιοχή στην άλλη, αντί να εντοπίζεται μια απλή ημερομηνία-ώρα μέσω του φακού κάποιας ζώνης ώρας.

Αυτό είναι διαφορετικό από τον εντοπισμό, καθώς η τοπική προσαρμογή αντιπροσωπεύει ένα διαφορετικό χρονικό σημείο, αλλά η μετατροπή της ζώνης ώρας ενός αντικειμένου αντιπροσωπεύει το ίδιο χρονικό σημείο, μέσω διαφορετικού φακού:

import datetime as dt
import pytz

timezone_nw = pytz.timezone('America/New_York')
nw_datetime_obj = dt.datetime.now(timezone_nw)

timezone_london = pytz.timezone('Europe/London')
london_datetime_obj = nw_datetime_obj.astimezone(timezone_london)


print('America/New_York:', nw_datetime_obj)
print('Europe/London:', london_datetime_obj)

Αρχικά, δημιουργήσαμε ένα αντικείμενο ημερομηνίας ώρας με την τρέχουσα ώρα και το ορίσαμε ως ζώνη ώρας "America/New_York". Στη συνέχεια χρησιμοποιώντας το astimezone() μέθοδο, το έχουμε μετατρέψει datetime στη ζώνη ώρας «Ευρώπη/Λονδίνο». Και τα δυο datetimeΤο s θα εκτυπώσει διαφορετικές τιμές, χρησιμοποιώντας τη μετατόπιση UTC ως σύνδεσμο αναφοράς μεταξύ τους:

America/New_York: 2022-11-30 21:24:30.123400-05:00
Europe/London: 2022-12-01 02:24:30.123400+00:00

2:24 την επόμενη μέρα στο Λονδίνο is την ίδια χρονική στιγμή με τις 21:24 της προηγούμενης ημέρας στη Νέα Υόρκη καθώς το Λονδίνο είναι 5 ώρες μπροστά.

Όπως ήταν αναμενόμενο, οι ημερομηνίες-ώρες είναι διαφορετικές, καθώς απέχουν περίπου 5 ώρες μεταξύ τους.

Μετατροπή συμβολοσειράς σε ώρα ημερομηνίας χρησιμοποιώντας βιβλιοθήκες τρίτων

Πύθωνα datetime Η μονάδα μπορεί να μετατρέψει όλους τους διαφορετικούς τύπους συμβολοσειρών σε α datetime αντικείμενο. Αλλά το κύριο πρόβλημα είναι ότι για να γίνει αυτό πρέπει να δημιουργήσετε την κατάλληλη συμβολοσειρά κώδικα μορφοποίησης που strptime() μπορεί να καταλάβει. Η δημιουργία αυτής της συμβολοσειράς απαιτεί χρόνο και κάνει τον κώδικα δυσκολότερο στην ανάγνωση.

Αντίθετα, μπορούμε να χρησιμοποιήσουμε άλλες βιβλιοθήκες τρίτων για να το κάνουμε πιο εύκολο.

Σε ορισμένες περιπτώσεις, αυτές οι βιβλιοθήκες τρίτων έχουν επίσης καλύτερη ενσωματωμένη υποστήριξη για τον χειρισμό και τη σύγκριση ημερομηνιών-ωρών, ενώ ορισμένες έχουν ακόμη και ενσωματωμένες ζώνες ώρας, επομένως δεν χρειάζεται να συμπεριλάβετε ένα επιπλέον πακέτο PyTz.

Ας ρίξουμε μια ματιά σε μερικές από αυτές τις βιβλιοθήκες στις ακόλουθες ενότητες.

Μετατρέψτε το String σε Datetime με το dateutil

Η ενότητα dateutil είναι μια επέκταση στο datetime μονάδα μέτρησης. Ένα πλεονέκτημα είναι ότι δεν χρειάζεται να περάσουμε κανέναν κωδικό ανάλυσης για να αναλύσουμε μια συμβολοσειρά!

Για αυτόματη μετατροπή μιας συμβολοσειράς σε ημερομηνία ώρας χωρίς διακριτικό μορφής χρησιμοποιώντας Python dateutil:

from dateutil.parser import parse
datetime = parse('2018-06-29 22:21:41')

print(datetime)

Αυτός ο διαλογισμός στα parse η συνάρτηση θα αναλύσει τη συμβολοσειρά αυτόματα! Δεν χρειάζεται να συμπεριλάβετε καμία συμβολοσειρά μορφής. Ας προσπαθήσουμε να αναλύσουμε διαφορετικούς τύπους συμβολοσειρών χρησιμοποιώντας dateutil:

from dateutil.parser import parse

date_array = [
    '2018-06-29 08:15:27.243860',
    'Jun 28 2018 7:40AM',
    'Jun 28 2018 at 7:40AM',
    'September 18, 2017, 22:19:55',
    'Sun, 05/12/1999, 12:30PM',
    'Mon, 21 March, 2015',
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    'Tuesday , 6th September, 2017 at 4:30pm'
]

for date in date_array:
    print('Parsing: ' + date)
    dt = parse(date)
    print(dt.date())
    print(dt.time())
    print(dt.tzinfo)
    print('n')

Παραγωγή:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29
08:15:27.243860
None

Parsing: Jun 28 2018 7:40AM
2018-06-28
07:40:00
None

Parsing: Jun 28 2018 at 7:40AM
2018-06-28
07:40:00
None

Parsing: September 18, 2017, 22:19:55
2017-09-18
22:19:55
None

Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12
12:30:00
None

Parsing: Mon, 21 March, 2015
2015-03-21
00:00:00
None

Parsing: 2018-03-12T10:12:45Z
2018-03-12
10:12:45
tzutc()

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29
17:08:00.586525
tzutc()

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29
17:08:00.586525
tzoffset(None, 18000)

Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06
16:30:00
None

Μπορείτε να δείτε ότι σχεδόν κάθε τύπος συμβολοσειράς μπορεί να αναλυθεί εύκολα χρησιμοποιώντας το dateutil μονάδα μέτρησης.

Αν και αυτό είναι βολικό, θυμηθείτε από νωρίτερα ότι η πρόβλεψη της μορφής κάνει τον κώδικα πολύ πιο αργό, επομένως εάν ο κώδικας απαιτεί υψηλή απόδοση, τότε αυτή μπορεί να μην είναι η σωστή προσέγγιση για την εφαρμογή σας.

Μετατρέψτε το String σε Datetime με τη Maya

Μάγια καθιστά επίσης πολύ εύκολη την ανάλυση μιας συμβολοσειράς και την αλλαγή των ζωνών ώρας. Για να μετατρέψετε εύκολα μια συμβολοσειρά με τη Maya της Python:

import maya

dt = maya.parse('2018-04-29T17:45:25Z').datetime()
print(dt.date())
print(dt.time())
print(dt.tzinfo)

Παραγωγή:

2018-04-29
17:45:25
UTC

Για τη μετατροπή της ώρας σε διαφορετική ζώνη ώρας:

import maya

dt = maya.parse('2018-04-29T17:45:25Z').datetime(to_timezone='America/New_York', naive=False)
print(dt.date())
print(dt.time())
print(dt.tzinfo)

Παραγωγή:

2018-04-29
13:45:25
America/New_York

Τώρα δεν είναι εύκολο στη χρήση; Ας δοκιμάσουμε maya με το ίδιο σύνολο χορδών που χρησιμοποιήσαμε dateutil:

import maya

date_array = [
    '2018-06-29 08:15:27.243860',
    'Jun 28 2018 7:40AM',
    'Jun 28 2018 at 7:40AM',
    'September 18, 2017, 22:19:55',
    'Sun, 05/12/1999, 12:30PM',
    'Mon, 21 March, 2015',
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    'Tuesday , 6th September, 2017 at 4:30pm'
]

for date in date_array:
    print('Parsing: ' + date)
    dt = maya.parse(date).datetime()
    print(dt)
    
    
    
    

Παραγωγή:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29 08:15:27.243860+00:00

Parsing: Jun 28 2018 7:40AM
2018-06-28 07:40:00+00:00

Parsing: Jun 28 2018 at 7:40AM
2018-06-28 07:40:00+00:00

Parsing: September 18, 2017, 22:19:55
2017-09-18 22:19:55+00:00

Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12 12:30:00+00:00

Parsing: Mon, 21 March, 2015
2015-03-21 00:00:00+00:00

Parsing: 2018-03-12T10:12:45Z
2018-03-12 10:12:45+00:00

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29 17:08:00.586525+00:00

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29 12:08:00.586525+00:00

Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06 16:30:00+00:00

Όπως μπορείτε να δείτε, όλες οι μορφές ημερομηνίας αναλύθηκαν με επιτυχία!

Εάν δεν παρέχουμε τις πληροφορίες της ζώνης ώρας, τότε τις μετατρέπει αυτόματα σε UTC. Επομένως, είναι σημαντικό να σημειωθεί ότι εμείς πρέπει παρέχετε το to_timezone και naive παραμέτρους εάν η ώρα δεν είναι σε UTC.

Μετατροπή συμβολοσειράς σε ώρα ημερομηνίας με το βέλος

βέλος είναι μια άλλη βιβλιοθήκη για την αντιμετώπιση της ημερομηνίας στην Python. Και όπως πριν με maya, υπολογίζει επίσης αυτόματα τη μορφή ημερομηνίας. Μόλις ερμηνευτεί, επιστρέφει μια Python datetime αντικείμενο από το arrow αντικείμενο.

Για να μετατρέψετε εύκολα μια συμβολοσειρά σε datetime χρησιμοποιώντας Python arrow:

import arrow

dt = arrow.get('2018-04-29T17:45:25Z')
print(dt.date())
print(dt.time())
print(dt.tzinfo)

Παραγωγή:

2018-04-29
17:45:25
tzutc()

Και εδώ είναι πώς μπορείτε να χρησιμοποιήσετε arrow για να μετατρέψετε ζώνες ώρας χρησιμοποιώντας το to() μέθοδος:

import arrow

dt = arrow.get('2018-04-29T17:45:25Z').to('America/New_York')
print(dt)
print(dt.date())
print(dt.time())

Παραγωγή:

2018-04-29T13:45:25-04:00
2018-04-29
13:45:25

Όπως μπορείτε να δείτε, η συμβολοσειρά ημερομηνίας-ώρας μετατρέπεται στην περιοχή "America/New_York".

Τώρα, ας χρησιμοποιήσουμε ξανά το ίδιο σύνολο συμβολοσειρών που χρησιμοποιήσαμε παραπάνω:

import arrow

date_array = [
    '2018-06-29 08:15:27.243860',
    
    
    
    
    
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    
]

for date in date_array:
    dt = arrow.get(date)
    print('Parsing: ' + date)
    print(dt)
    
    
    
    

Αυτός ο κώδικας θα αποτύχει για τις συμβολοσειρές ημερομηνίας-ώρας που έχουν σχολιαστεί, που είναι πάνω από το ήμισυ των παραδειγμάτων μας. Η έξοδος για άλλες συμβολοσειρές θα είναι:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29T08:15:27.243860+00:00

Parsing: 2018-03-12T10:12:45Z
2018-03-12T10:12:45+00:00

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29T17:08:00.586525+00:00

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29T17:08:00.586525+05:00

Για να αναλύσετε σωστά τις συμβολοσειρές ημερομηνίας-ώρας που σχολιάζονται, θα πρέπει να περάσετε τα αντίστοιχα μορφοποιήστε διακριτικά για να δώσει στη βιβλιοθήκη ενδείξεις για το πώς να το αναλύσει.

Συμπέρασμα

Σε αυτό το άρθρο δείξαμε διαφορετικούς τρόπους ανάλυσης μιας συμβολοσειράς σε a datetime αντικείμενο στην Python. Μπορείτε είτε να επιλέξετε την προεπιλεγμένη Python datetime βιβλιοθήκη ή οποιαδήποτε από τις βιβλιοθήκες τρίτων που αναφέρονται σε αυτό το άρθρο, μεταξύ πολλών άλλων.

Το κύριο πρόβλημα με την προεπιλογή datetime Το πακέτο είναι ότι πρέπει να καθορίσουμε τον κωδικό ανάλυσης με μη αυτόματο τρόπο για σχεδόν όλες τις μορφές συμβολοσειράς ημερομηνίας-ώρας. Έτσι, εάν η μορφή συμβολοσειράς σας αλλάξει στο μέλλον, πιθανότατα θα πρέπει να αλλάξετε και τον κώδικά σας. Αλλά πολλές βιβλιοθήκες τρίτων, όπως αυτές που αναφέρονται εδώ, το χειρίζονται αυτόματα.

Ένα ακόμη πρόβλημα που αντιμετωπίζουμε είναι η αντιμετώπιση των ζωνών ώρας. Ο καλύτερος τρόπος για να τα χειριστείτε είναι πάντα να αποθηκεύετε την ώρα στη βάση δεδομένων σας σε μορφή UTC και στη συνέχεια να τη μετατρέπετε στην τοπική ζώνη ώρας του χρήστη όταν χρειάζεται.

Αυτές οι βιβλιοθήκες δεν είναι μόνο καλές για την ανάλυση συμβολοσειρών, αλλά μπορούν να χρησιμοποιηθούν για πολλούς διαφορετικούς τύπους λειτουργιών που σχετίζονται με την ημερομηνία-ώρα. Θα σας συνιστούσα να διαβάσετε τα έγγραφα για να μάθετε τις λειτουργίες λεπτομερώς.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse