Hämta veckodagen eller månaden från ett datum i Python som en sträng (t.ex. tyska eller engelska).

Företag

Med hjälp av Pythons standardbibliotek datetime kan du skapa ett datetime-objekt från en datumsträng och hämta namnet på veckodagen eller månaden som en sträng. Språket i dessa strängar beror dock på miljöns locale (land- eller regioninställning).

Här är två sätt att få fram namnet på veckodagen eller månaden från ett datum som en sträng på vilket språk som helst.

  • Ändra språket med modulen locale
  • Definiera en ny funktion

Mer information om den grundläggande användningen av datetime-modulen och metoderna strptime() och strftime() för konvertering mellan datum och tid (datum, tid) och strängar finns i följande artiklar.

Ändra språket med modulen för språket

Pythons standardbibliotek innehåller en locale-modul för att kontrollera lokalinställningarna.

Det beror på miljön, men i exempelmiljön kan namnen på veckodagarna och månaderna fås i engelsk notation genom att använda följande formateringskod i metoden strftime().
%A, %a, %B, %b

I följande exempel används ett datetime-objekt för att representera datum och tid (datum och tid), men samma sak gäller för ett date-objekt som endast innehåller datuminformation.

import datetime
import locale

dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00

print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan

LC_TIME, den lokala kategorin för tidsformatering, kontrolleras med locale.getlocale() och är satt till None. Resultatet beror på miljön.

print(locale.getlocale(locale.LC_TIME))
# (None, None)

LC_TIME till japanska (UTF-8) ja_JP.UTF-8 i locale.setlocale() för att få fram namnen på dag och månad på japanska. locale.LC_ALL kan användas för att ställa in alla lokalkategorier, men observera att detta påverkar till exempel LC_MONETARY, till exempel.

Observera att dessa ändringar endast gäller för denna kod. Det betyder inte att systemets miljövariabler kommer att skrivas om.

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(locale.getlocale(locale.LC_TIME))
# ('ja_JP', 'UTF-8')

print(dt.strftime('%A, %a, %B, %b'))
# 月曜日, 月, 1月,  1

Du kan också ändra lokalinställningarna för att använda andra språkbeteckningar, t.ex. engelska eller tyska.

locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan

locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Montag, Mo, Januar, Jan

Om du vill få fram veckodagen för ett visst datum från en datumsträng på vilket språk som helst kan du göra det genom att följa nedanstående steg.

  • LC_TIME till värdet för den önskade språkinställningen (t.ex. ja_JP.UTF-8) i locale.setlocale()
  • Konvertera en sträng till ett datumobjekt med strptime()
  • Kalla strftime() på detta datetime-objekt med följande formateringskod: %A, %a, %B, %b
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')

s = '2018-01-01'
s_dow = datetime.datetime.strptime(s, '%Y-%m-%d').strftime('%A')

print(s_dow)
# 月曜日

Definiera en ny funktion

Detta kan uppnås genom att definiera en ny funktion.

Metoden weekday() för datetime-objektet ger ett heltalsvärde på 0 för måndag och 6 för söndag.

import datetime

dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00

print(dt.weekday())
# 0

print(type(dt.weekday()))
# <class 'int'>

Det finns en liknande metod, isoweekday(), som returnerar ett heltalsvärde på 1 för måndag och 7 för söndag. Observera att det finns en subtil skillnad.

print(dt.isoweekday())
# 1

print(type(dt.isoweekday()))
# <class 'int'>

Om vi definierar en lista med namn på veckodagarna för varje språksträng och hämtar dem med hjälp av de heltalsvärden som erhålls med metoden weekday() kan vi nå vårt mål.