使用Python的标准库datetime,你可以从一个日期字符串中创建一个datetime对象,并从中获得作为字符串的星期或月份的名称。然而,这些字符串的语言取决于环境中的locale(国家或地区设置)。
这里有两种方法可以从一个日期中获得星期或月份的名称,作为任何语言的字符串。
- 用locale模块改变locale
- 定义一个新的函数
更多关于datetime模块的基本用法以及在日期和时间(date, time)与字符串之间转换的strptime()和strftime()方法的信息,请参考以下文章。
用locale模块改变locale
Python标准库提供了一个locale模块来控制locale设置。
这取决于环境,但在示例环境中,使用strftime()方法中的以下格式化代码,可以得到英文符号的星期和月份的名称。%A
, %a
, %B
, %b
下面的例子用一个datetime对象来表示日期和时间(date and time),但对于只有日期信息的date对象来说也是如此。
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,用于时间格式化的locale类别设置,通过locale.getlocale()检查,它被设置为无。这个结果取决于环境。
print(locale.getlocale(locale.LC_TIME))
# (None, None)
locale.setlocale()中的LC_TIME改为日语(UTF-8)ja_JP.UTF-8,以获得日语的日名和月名。 locale.LC_ALL可以用来设置所有的locale类别,但要注意,这将影响,例如LC_MONETARY,。
注意,这些变化只在这段代码中有效。这并不意味着系统环境变量将被重写。
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
你也可以改变地区设置,使用其他语言符号,如英语或德语。
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
如果你想从任何语言的日期字符串中获得一个给定日期的星期,你可以通过以下步骤来实现。
- 在locale.setlocale()中,将LC_TIME改为所需语言设置的值(如ja_JP.UTF-8)。
- 用strptime()将一个字符串转换为一个日期时间对象
- 对该日期时间对象调用strftime(),其格式化代码如下:
%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)
# 月曜日
定义一个新的函数
这可以通过定义一个新的函数来实现。
datetime对象的weekday()方法给出了一个整数值,0代表周一,6代表周日。
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'>
有一个类似的方法,isoweekday(),它返回一个整数值,1代表星期一,7代表星期天。请注意,有一个微妙的区别。
print(dt.isoweekday())
# 1
print(type(dt.isoweekday()))
# <class 'int'>
如果我们为每种语言字符串定义一个星期的名称列表,并使用weekday()方法获得的整数值来检索它们,我们就可以实现我们的目标。