Verkrijg de dag van de week of de maand van een datum in Python als een string (bv. Duits of Engels)

Bedrijf

Met behulp van Python's standaard bibliotheek datetime, kan je een datetime object maken van een datum string en de naam van de dag van de week of de maand eruit halen als een string. De taal van die tekenreeksen hangt echter af van de locale (land- of regio-instelling) van de omgeving.

Hier zijn twee manieren om de naam van de dag van de week of de maand te krijgen van een datum als een string in elke taal.

  • Verander de locale met de locale module
  • Definieer een nieuwe functie

Voor meer informatie over het basisgebruik van de datetime module en de methodes strptime() en strftime() voor het omzetten tussen datum en tijd (date, time) en strings, zie de volgende artikels.

Verander van locale met locale module

De Python standaard bibliotheek voorziet in een locale module om de locale instellingen te regelen.

Het hangt af van de omgeving, maar in de voorbeeldomgeving, met behulp van de volgende opmaakcode in de strftime() methode, kunnen de namen van de dagen van de week en de maanden in Engelse notatie worden verkregen.
%A, %a, %B, %b

Het volgende voorbeeld gebruikt een datetime object om datum en tijd (date and time) weer te geven, maar hetzelfde geldt voor een date object dat alleen datuminformatie bevat.

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, de instelling van de locale categorie voor tijdopmaak, wordt gecontroleerd met locale.getlocale(), en deze wordt op None gezet. Dit resultaat hangt af van de omgeving.

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

LC_TIME naar Japans (UTF-8) ja_JP.UTF-8 in locale.setlocale() om de dag- en maandnamen in het Japans te krijgen. locale.LC_ALL kan worden gebruikt om alle locale categorieën in te stellen, maar let op dat dit bijvoorbeeld LC_MONETARY zal beïnvloeden.

Merk op dat deze veranderingen alleen effectief zijn in deze code. Het betekent niet dat de systeem omgevingsvariabelen herschreven zullen worden.

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

U kunt ook de locale instellingen wijzigen om andere taalnotaties te gebruiken, zoals Engels of Duits.

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

Als u de dag van de week voor een bepaalde datum wilt verkrijgen uit een datumreeks in een willekeurige taal, kunt u dat doen door de onderstaande stappen te volgen.

  • LC_TIME naar de waarde van de gewenste taalinstelling (bijv. ja_JP.UTF-8) in locale.setlocale()
  • Een string converteren naar een datetime object met strptime()
  • Roep strftime() op dat datetime object aan met de volgende opmaakcode: %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)
# 月曜日

Definieer een nieuwe functie

Dit kan worden bereikt door een nieuwe functie te definiëren.

De weekdag() methode van het datetime object geeft een gehele waarde van 0 voor maandag en 6 voor zondag.

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'>

Er is een vergelijkbare methode, isoweekday(), die een gehele waarde van 1 voor maandag en 7 voor zondag teruggeeft. Merk op dat er een subtiel verschil is.

print(dt.isoweekday())
# 1

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

Als we voor elke taalstring een lijst met namen van de dagen van de week definiëren en die opvragen met behulp van de gehele getallen die door de methode weekday() worden verkregen, kunnen we ons doel bereiken.