Pythons standardbibliotek datetime kan bruges til at behandle datoer og tidspunkter (datoer, tidspunkter og tidspunkter). Metoderne strftime() og strptime(), som konverterer datoer og tidspunkter til og fra strenge, kan bruges til at manipulere datoer og tidspunkter i en række forskellige formater.
Den kan også udføre operationer som subtraktion og addition. Du kan f.eks. nemt beregne og få datoen for 10 dage siden eller om 3 uger eller klokken om 50 minutter fra nu.
Først vil vi beskrive følgende klasser af objekter, der er tilgængelige i datetime-modulet.
datetime.datetime
:Dato og klokkeslæt (dato og klokkeslæt)datetime.date
:Datodatetime.time
:Tiddatetime.timedelta
:Tidsforskel og forløbne tid
Metoderne strftime() og strptime(), som konverterer date\time og string til hinanden, er også forklaret.
datetime
objektdatetime.now()
:Dagens dato, nuværende klokkeslætdatetime
Objektkonstruktør- Konvertering af et datetime-objekt til et date-objekt
date
objektdate.today()
:Dagens dato- Konstruktør for datoobjektet
time
objekt- Konstruktør for tidsobjektet
timedelta
objekt- Subtraherer datetime- og datoobjekter for at oprette timedelta-objekter.
- Konstruktør for timedelta-objektet
- Subtraktion og addition ved hjælp af timedelta-objekter
strftime()
:Konvertering fra dato og klokkeslæt til strengstrptime()
:Konvertering fra streng til dato og tid
Kalendermodulet, som genererer kalendere i almindelig tekst eller HTML-format, er også inkluderet i standardbiblioteket.
datetime-objekt
Et datetime-objekt er et objekt, der indeholder både dato- (år, måned, dag) og tidsoplysninger (time, minut, sekund, mikrosekund). Du kan få adgang til disse oplysninger med følgende attributter.
year
month
day
hour
minute
second
microsecond
datetime.now(): Dagens dato, nuværende klokkeslæt
datetime.now() giver dig et datetime-objekt med dagens dato (den aktuelle dato) og det aktuelle klokkeslæt.
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
Konstruktør for datetime-objekt
Det er også muligt at generere datotidsobjekter for vilkårlige datoer og tidspunkter.
Konstruktøren for datetime-objektet er som følger.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Følgende værdier er obligatoriske, og andre kan udelades. Hvis de udelades, er standardværdien 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
Konvertering af et datetime-objekt til et date-objekt
Et datetime-objekt kan konverteres til et date-objekt ved hjælp af date()-metoden, som beskrevet nedenfor.
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'>
datoobjekt
Et dato-objekt er et objekt, der indeholder oplysninger om en dato (år, måned, dag). Det kan tilgås ved hjælp af attributterne år, måned og dag.
date.today(): Dagens dato
Dato-objektet for den aktuelle dato (dagens dato) kan fås med 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
Konstruktør for datoobjektet
Konstruktøren for dato-objektet er som følger
date(year, month, day)
Alle er obligatoriske og kan ikke udelades.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
tidsobjekt
Time-objektet er et objekt, der indeholder oplysninger om tid (timer, minutter, sekunder og mikrosekunder). Det kan tilgås ved hjælp af attributterne time, minut, sekund og mikrosekund.
Konstruktør for tidsobjektet
Konstruktøren af time-objektet er som følger.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
De er alle valgfrie, og hvis de udelades, sættes de til 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-objekt
Timedelta-objektet er et objekt, der repræsenterer tidsforskellen mellem to datoer og tidspunkter, eller den forløbstid, der er gået. Det har oplysninger i dage, sekunder og mikrosekunder og kan tilgås ved hjælp af attributterne dage, sekunder og mikrosekunder. Det er også muligt at få det samlede antal sekunder ved hjælp af metoden total_seconds().
Subtraherer datetime- og date-objekter for at skabe timedelta-objekt.
Subtraktion af datetime-objekter fra hinanden giver et timedelta-objekt.
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
Subtraktion af dato-objekter fra hinanden giver på samme måde et timedelta-objekt.
Konstruktør for timedelta-objektet
Konstruktøren af timedelta-objektet er som følger
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
De er alle valgfrie, og hvis de udelades, sættes de til 0.
Bemærk, at timedelta-objektet kun indeholder følgende oplysninger.
- et antal dage:
days
- antal sekunder:
seconds
- antal mikrosekunder:
microseconds
For eksempel er følgende to lige store
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Subtraktion og addition ved hjælp af timedelta-objekter
Timedelta-objektet kan bruges sammen med datetime- og date-objekterne til at udføre operationer som subtraktion og addition. Du kan f.eks. nemt beregne og hente datoen for en uge siden eller om 10 dage eller klokken 50 minutter fra nu.
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
Den kan også bruges til at beregne antallet af dage indtil en bestemt dato.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime(): Konvertering fra dato og klokkeslæt til streng
Metoden strftime() for datetime- og dateobjekter kan bruges til at konvertere dato- og tidsoplysninger (dato og klokkeslæt) til en streng i et hvilket som helst format.
kode for formatering
Se den officielle dokumentation nedenfor for tilgængelige formateringskoder.
De vigtigste formateringskoder er anført nedenfor.
%d
:Dag i måneden i decimal notation med nul udfyldt.%m
:Måned i decimal notation med nul udfyldt.%y
:De sidste to cifre i året i decimaltalsangivelse med nul.%Y
:Fire cifre i årstallet i decimal notation med nul udfyldt.%H
:I decimal notation med nul udfyldt (24-timers notation)%I
:I decimalnotation med nul udfyldt (12-timers notation)%M
:For decimal notation med nul udfyldt.%S
:Sekunder i decimal notation med nul udfyldt.%f
:Mikrosekunder (6 cifre) i decimal notation med 0 udfyldt.%A
:Navnet på ugedagen for lokalområdet%a
:Dagens navn for lokalområdet (forkortet form)%B
:Navn på den lokale måned%b
:Navnet på den lokale måned (forkortet form)%j
:Årets dag i decimal notation med nuludfyldning.%U
:Årets ugenummer i decimalnotation med nul som fyld (ugen begynder søndag)%W
:Årets ugenummer i decimalnotation med nul som fyld (ugen begynder mandag)
De følgende formateringskoder for dag- og månedsnavne kan fås i forskellige strenge afhængigt af lokalområdet.
%A
%a
%B
%b
Der findes også en særlig metode til ISO 8601-formatstrenge.
Kodeeksempel
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
Hvis du ønsker at få et tal i stedet for en streng, skal du blot konvertere det til et heltal med int().
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
I kombination med timedelta-objektet er det let at oprette f.eks. en liste over datoer hver anden uge i et hvilket som helst format.
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
Det er smartere at bruge list comprehension notation.
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']
- Relaterede artikler:Brug af Python list comprehensions notation
strptime(): Konvertering fra streng til dato og tid
datetime strptime() kan bruges til at oprette et datetime-objekt ud fra en dato- eller tidsstreng. Det er nødvendigt at angive den formateringsstreng, der svarer til den oprindelige streng.
Der findes også en særlig metode til ISO 8601-strenge (Python 3.7 eller nyere).
Kodeeksempel
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'>
Ved at bruge strftime()-metoden på det hentede datetime-objekt kan du repræsentere dato og klokkeslæt i et andet format end den oprindelige streng.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Hvis du konverterer den til et datetime-objekt, kan du også udføre operationer med timedelta-objekter, så du f.eks. kan generere en streng af en dato for 10 dage siden i samme format.
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