从Python中的一个日期中获取星期或月份的字符串(例如德语或英语)。

商业

使用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()方法获得的整数值来检索它们,我们就可以实现我们的目标。