Η τυπική βιβλιοθήκη datetime της Python μπορεί να χρησιμοποιηθεί για την επεξεργασία ημερομηνιών και χρόνων (ημερομηνίες, ώρες και χρόνοι). Οι μέθοδοι strftime() και strptime(), οι οποίες μετατρέπουν ημερομηνίες και ώρες σε και από συμβολοσειρές, μπορούν να χρησιμοποιηθούν για την επεξεργασία ημερομηνιών και ωρών σε διάφορες μορφές.
Μπορεί επίσης να εκτελεί πράξεις όπως η αφαίρεση και η πρόσθεση. Για παράδειγμα, μπορείτε εύκολα να υπολογίσετε και να λάβετε την ημερομηνία πριν από 10 ημέρες ή σε 3 εβδομάδες από τώρα ή την ώρα σε 50 λεπτά από τώρα.
Αρχικά, θα περιγράψουμε τις ακόλουθες κατηγορίες αντικειμένων που είναι διαθέσιμες στην ενότητα datetime.
datetime.datetime
:Ημερομηνία και ώρα (ημερομηνία και ώρα)datetime.date
:Ημερομηνίαdatetime.time
:Χρόνοςdatetime.timedelta
:Χρονική διαφορά και χρόνος που παρήλθε
Εξηγούνται επίσης οι μέθοδοι strftime() και strptime(), οι οποίες μετατρέπουν το date\time και το string το ένα στο άλλο.
datetime
αντικείμενοdatetime.now()
:Σημερινή ημερομηνία, τρέχουσα ώραdatetime
Κατασκευαστής αντικειμένων- Μετατροπή ενός αντικειμένου datetime σε αντικείμενο ημερομηνίας
date
αντικείμενοdate.today()
:Σημερινή ημερομηνία- Κατασκευαστής για το αντικείμενο date
time
αντικείμενο- Κατασκευαστής για το αντικείμενο time
timedelta
αντικείμενο- Αφαίρεση των αντικειμένων datetime και date για τη δημιουργία αντικειμένων timedelta.
- Κατασκευαστής για το αντικείμενο timedelta
- Αφαίρεση και πρόσθεση με χρήση αντικειμένων timedelta
strftime()
:Μετατροπή από ημερομηνία και ώρα σε συμβολοσειράstrptime()
:Μετατροπή από συμβολοσειρά σε ημερομηνία και ώρα
Στην τυπική βιβλιοθήκη περιλαμβάνεται επίσης η ενότητα ημερολογίου, η οποία παράγει ημερολόγια σε μορφή απλού κειμένου ή HTML.
datetime αντικείμενο
Ένα αντικείμενο datetime είναι ένα αντικείμενο που περιέχει πληροφορίες τόσο για την ημερομηνία (έτος, μήνας, ημέρα) όσο και για την ώρα (ώρα, λεπτό, δευτερόλεπτο, μικροδευτερόλεπτο). Μπορείτε να έχετε πρόσβαση σε αυτές τις πληροφορίες με τα ακόλουθα χαρακτηριστικά.
year
month
day
hour
minute
second
microsecond
datetime.now(): Σημερινή ημερομηνία, τρέχουσα ώρα
Η datetime.now() θα σας δώσει ένα αντικείμενο datetime με τη σημερινή ημερομηνία (την τρέχουσα ημερομηνία) και την τρέχουσα ώρα.
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231
print(type(dt_now))
# <class 'datetime.datetime'>
print(dt_now.year)
# 2018
print(dt_now.hour)
# 18
Κατασκευαστής για αντικείμενο datetime
Είναι επίσης δυνατή η δημιουργία αντικειμένων datetime για αυθαίρετες ημερομηνίες και ώρες.
Ο κατασκευαστής για το αντικείμενο datetime έχει ως εξής.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Οι ακόλουθες τιμές είναι υποχρεωτικές και οι υπόλοιπες μπορούν να παραλειφθούν. Εάν παραλειφθεί, η προεπιλεγμένη τιμή είναι 0.
year
month
day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000
print(dt.minute)
# 15
print(dt.microsecond)
# 2000
dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00
print(dt.minute)
# 0
Μετατροπή ενός αντικειμένου datetime σε αντικείμενο ημερομηνίας
Ένα αντικείμενο datetime μπορεί να μετατραπεί σε αντικείμενο ημερομηνίας με τη μέθοδο date(), όπως περιγράφεται στη συνέχεια.
print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>
print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>
αντικείμενο ημερομηνίας
Ένα αντικείμενο ημερομηνίας είναι ένα αντικείμενο που περιέχει πληροφορίες σχετικά με μια ημερομηνία (έτος, μήνας, ημέρα). Η πρόσβαση σε αυτό μπορεί να γίνει με τα χαρακτηριστικά έτος, μήνας και ημέρα.
date.today(): Σημερινή ημερομηνία
Το αντικείμενο ημερομηνίας της τρέχουσας ημερομηνίας (σημερινή ημερομηνία) μπορεί να ληφθεί με την date.today().
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
Κατασκευαστής για το αντικείμενο date
Ο κατασκευαστής για το αντικείμενο date έχει ως εξής
date(year, month, day)
Όλα είναι υποχρεωτικά και δεν μπορούν να παραλειφθούν.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
αντικείμενο χρόνου
Το αντικείμενο time είναι ένα αντικείμενο που περιέχει πληροφορίες σχετικά με τον χρόνο (ώρες, λεπτά, δευτερόλεπτα και μικροδευτερόλεπτα). Η πρόσβαση σε αυτό μπορεί να γίνει με τη χρήση των χαρακτηριστικών hour, minute, second και microsecond.
Κατασκευαστής για το αντικείμενο time
Ο κατασκευαστής του αντικειμένου time έχει ως εξής.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Όλα αυτά είναι προαιρετικά και αν παραλειφθούν, τίθενται σε 0.
t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000
print(type(t))
# <class 'datetime.time'>
print(t.hour)
# 12
t = datetime.time()
print(t)
# 00:00:00
αντικείμενο timedelta
Το αντικείμενο timedelta είναι ένα αντικείμενο που αναπαριστά τη χρονική διαφορά μεταξύ δύο ημερομηνιών και ωρών ή τον χρόνο που έχει παρέλθει. Διαθέτει πληροφορίες σε ημέρες, δευτερόλεπτα και μικροδευτερόλεπτα και μπορεί να προσπελαστεί με τα χαρακτηριστικά days, seconds και microseconds. Είναι επίσης δυνατό να ληφθεί ο συνολικός αριθμός των δευτερολέπτων χρησιμοποιώντας τη μέθοδο total_seconds().
Αφαίρεση των αντικειμένων datetime και date για τη δημιουργία του αντικειμένου timedelta.
Η αφαίρεση των αντικειμένων datetime μεταξύ τους δίνει ένα αντικείμενο timedelta.
td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231
print(type(td))
# <class 'datetime.timedelta'>
print(td.days)
# 1
print(td.seconds)
# 66673
print(td.microseconds)
# 271231
print(td.total_seconds())
# 153073.271231
Η αφαίρεση των αντικειμένων ημερομηνίας μεταξύ τους δίνει ομοίως ένα αντικείμενο timedelta.
Κατασκευαστής για το αντικείμενο timedelta
Ο κατασκευαστής του αντικειμένου timedelta έχει ως εξής
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Όλα αυτά είναι προαιρετικά και αν παραλειφθούν, τίθενται σε 0.
Σημειώστε ότι το αντικείμενο timedelta περιέχει μόνο τις ακόλουθες πληροφορίες.
- έναν αριθμό ημερών:
days
- αριθμός δευτερολέπτων:
seconds
- μέτρηση μικροδευτερολέπτων:
microseconds
Για παράδειγμα, τα ακόλουθα δύο είναι ίσα
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Αφαίρεση και πρόσθεση με χρήση αντικειμένων timedelta
Το αντικείμενο timedelta μπορεί να χρησιμοποιηθεί με τα αντικείμενα datetime και date για την εκτέλεση πράξεων όπως η αφαίρεση και η πρόσθεση. Για παράδειγμα, μπορείτε εύκολα να υπολογίσετε και να λάβετε την ημερομηνία πριν από μία εβδομάδα ή σε 10 ημέρες από τώρα ή την ώρα σε 50 λεπτά από τώρα.
d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26
td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00
dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231
td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00
print(td_50m.seconds)
# 3000
dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231
Μπορεί επίσης να χρησιμοποιηθεί για τον υπολογισμό του αριθμού των ημερών μέχρι μια συγκεκριμένη ημερομηνία.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime(): Μετατροπή από ημερομηνία και ώρα σε συμβολοσειρά
Η μέθοδος strftime() των αντικειμένων datetime και date μπορεί να χρησιμοποιηθεί για τη μετατροπή πληροφοριών ημερομηνίας και ώρας (ημερομηνία και ώρα) σε συμβολοσειρά σε οποιαδήποτε μορφή.
κωδικός μορφοποίησης
Ανατρέξτε στην επίσημη τεκμηρίωση παρακάτω για τους διαθέσιμους κωδικούς μορφοποίησης.
Οι κύριοι κωδικοί μορφοποίησης παρατίθενται παρακάτω.
%d
:Ημέρα του μήνα σε δεκαδική σημειογραφία με μηδενική συμπλήρωση.%m
:Μήνας σε δεκαδική σημειογραφία με μηδέν συμπληρωμένο.%y
:Τα δύο τελευταία ψηφία του έτους με μηδενική δεκαδική γραφή.%Y
:Τέσσερα ψηφία του έτους σε δεκαδική γραφή με μηδενική συμπλήρωση.%H
:Όταν εκφράζεται σε δεκαδική σημειογραφία με μηδενική συμπλήρωση (24ωρη σημειογραφία)%I
:Όταν εκφράζεται σε δεκαδική σημειογραφία με μηδενική συμπλήρωση (12ωρη σημειογραφία)%M
:Για δεκαδική σημειογραφία με μηδενική συμπλήρωση.%S
:Δευτερόλεπτα σε δεκαδική σημειογραφία με συμπληρωμένο μηδέν.%f
:Μικροδευτερόλεπτα (6 ψηφία) σε δεκαδική γραφή με συμπληρωμένο το 0.%A
:Όνομα της ημέρας της εβδομάδας για την τοποθεσία%a
:Όνομα της ημέρας για την περιοχή (συντομογραφία)%B
:Τοπική ονομασία μήνα%b
:Τοπική ονομασία μήνα (συντομευμένη μορφή)%j
:Ημέρα του έτους σε δεκαδική σημειογραφία με μηδενικό γέμισμα.%U
:Αριθμός εβδομάδας του έτους σε δεκαδική σημειογραφία με μηδενική συμπλήρωση (η εβδομάδα αρχίζει την Κυριακή)%W
:Αριθμός εβδομάδας του έτους σε δεκαδική σημειογραφία με μηδενική συμπλήρωση (η εβδομάδα αρχίζει τη Δευτέρα)
Οι ακόλουθοι κωδικοί μορφοποίησης για τα ονόματα ημέρας και μήνα μπορούν να προκύψουν σε διαφορετικές συμβολοσειρές ανάλογα με την τοπική γλώσσα.
%A
%a
%B
%b
Υπάρχει επίσης μια ειδική μέθοδος για συμβολοσειρές μορφής ISO 8601.
Δείγμα κώδικα
print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13
print(d_today.strftime('%y%m%d'))
# 180202
print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018
print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05
Αν θέλετε να λάβετε έναν αριθμό αντί για συμβολοσειρά, απλώς μετατρέψτε τον σε ακέραιο με την int().
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
Σε συνδυασμό με το αντικείμενο timedelta, είναι εύκολο να δημιουργήσετε, για παράδειγμα, μια λίστα με δεκαπενθήμερες ημερομηνίες σε οποιαδήποτε μορφή.
d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'
l = []
for i in range(n):
l.append((d + i * td).strftime(f))
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10
Η χρήση του συμβολισμού κατανόησης λίστας είναι πιο έξυπνη.
l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
- Σχετικά άρθρα:Χρήση του συμβολισμού κατανόησης λίστας της Python
strptime(): Μετατροπή από συμβολοσειρά σε ημερομηνία και ώρα
datetime Η strptime() μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός αντικειμένου datetime από μια συμβολοσειρά ημερομηνίας ή ώρας. Είναι απαραίτητο να καθοριστεί η συμβολοσειρά μορφοποίησης που αντιστοιχεί στην αρχική συμβολοσειρά.
Υπάρχει επίσης μια ειδική μέθοδος για συμβολοσειρές ISO 8601 (Python 3.7 ή νεότερη έκδοση).
Δείγμα κώδικα
date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00
print(type(date_dt))
# <class 'datetime.datetime'>
Χρησιμοποιώντας τη μέθοδο strftime() στο αντικείμενο datetime που ανακτάται, μπορείτε να αναπαραστήσετε την ημερομηνία και την ώρα σε διαφορετική μορφή από την αρχική συμβολοσειρά.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Αν το μετατρέψετε σε αντικείμενο datetime, μπορείτε επίσης να εκτελέσετε λειτουργίες με αντικείμενα timedelta, οπότε, για παράδειγμα, μπορείτε να δημιουργήσετε μια συμβολοσειρά μιας ημερομηνίας πριν από 10 ημέρες με την ίδια μορφή.
date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)
date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)
print(date_str_new)
# 2018-01-22