Używając standardowej biblioteki Pythona datetime, można utworzyć obiekt datetime z łańcucha daty i uzyskać z niego nazwę dnia tygodnia lub miesiąca w postaci ciągu znaków. Jednak język tych łańcuchów zależy od locale (ustawienia kraju lub regionu) środowiska.
Oto dwa sposoby, aby uzyskać nazwę dnia tygodnia lub miesiąca z daty jako ciąg znaków w dowolnym języku.
- Zmień locale za pomocą modułu locale
- Zdefiniuj nową funkcję
Więcej informacji na temat podstawowego użycia modułu datetime oraz metod strptime() i strftime() do konwersji pomiędzy datą i czasem (date, time) oraz łańcuchami znaków, znajdziesz w następujących artykułach.
- Powiązane artykuły:Konwersja dat i godzin na i z łańcuchów za pomocą datetime Pythona(
strftime
,strptime
)
Zmień locale za pomocą modułu locale
Biblioteka standardowa Pythona udostępnia moduł locale do kontroli ustawień locale.
Zależy to od środowiska, ale w przykładowym środowisku, używając poniższego kodu formatującego w metodzie strftime(), można uzyskać nazwy dni tygodnia i miesięcy w notacji angielskiej.%A
, %a
, %B
, %b
Poniższy przykład wykorzystuje obiekt datetime do reprezentacji daty i czasu (data i czas), lecz to samo jest prawdziwe dla obiektu date, który posiada tylko informację o dacie.
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, ustawienie kategorii locale dla formatowania czasu, jest sprawdzane za pomocą locale.getlocale() i jest ustawiane na None. Wynik ten zależy od środowiska.
print(locale.getlocale(locale.LC_TIME))
# (None, None)
LC_TIME na japońskie (UTF-8) ja_JP.UTF-8 w locale.setlocale(), aby uzyskać nazwy dni i miesięcy w języku japońskim. locale.LC_ALL może być użyte do ustawienia wszystkich kategorii locale, ale zauważ, że wpłynie to na, na przykład, LC_MONETARY.
Zwróć uwagę, że zmiany te obowiązują tylko w tym kodzie. Nie oznacza to, że systemowe zmienne środowiskowe zostaną przepisane.
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
Można również zmienić ustawienia locale, aby używać innych notacji językowych, takich jak angielski lub niemiecki.
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
Jeśli chcesz uzyskać dzień tygodnia dla danej daty z łańcucha daty w dowolnym języku, możesz to zrobić, wykonując poniższe kroki.
- LC_TIME do wartości żądanego ustawienia języka (np. ja_JP.UTF-8) w locale.setlocale()
- Konwersja ciągu znaków na obiekt datetime za pomocą strptime()
- Wywołaj funkcję strftime() na tym obiekcie datetime z następującym kodem formatującym:
%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)
# 月曜日
Zdefiniuj nową funkcję
Można to osiągnąć poprzez zdefiniowanie nowej funkcji.
Metoda weekday() obiektu datetime daje wartość całkowitą 0 dla poniedziałku i 6 dla niedzieli.
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'>
Istnieje podobna metoda, isoweekday(), która zwraca wartość całkowitą 1 dla poniedziałku i 7 dla niedzieli. Zauważ, że jest pewna subtelna różnica.
print(dt.isoweekday())
# 1
print(type(dt.isoweekday()))
# <class 'int'>
Jeśli zdefiniujemy listę nazw dni tygodnia dla każdego łańcucha językowego i pobierzemy je za pomocą wartości całkowitych uzyskanych przez metodę weekday(), możemy osiągnąć nasz cel.