在 Python 中,使用 datetime 模块获取星期几非常简单,主要有两种方法,一种是返回数字(0-6 或 1-7),另一种是返回星期名称的字符串。

使用 weekday() 和 isoweekday()
这两个方法都返回一个代表星期几的整数,但它们的起始编号不同。
datetime.date.weekday()
- 返回值:一个整数,周一为 0,周日为 6。
- 适用对象:
datetime.date对象和datetime.datetime对象。
示例代码:
import datetime
# 获取当前日期和时间
now = datetime.datetime.now()
# 只获取当前日期
today = datetime.date.today()
print(f"当前完整时间: {now}")
print(f"当前日期: {today}")
# 使用 weekday()
weekday_num_from_0 = today.weekday()
print(f"\n使用 weekday() (周一=0, 周日=6): {weekday_num_from_0}")
# 手动映射到中文
weekdays_zh_from_0 = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
print(f"今天是: {weekdays_zh_from_0[weekday_num_from_0]}")
datetime.date.isoweekday()
- 返回值:一个整数,周一为 1,周日为 7,这符合 ISO 8601 标准。
- 适用对象:
datetime.date对象和datetime.datetime对象。
示例代码:
import datetime
today = datetime.date.today()
# 使用 isoweekday()
weekday_num_from_1 = today.isoweekday()
print(f"使用 isoweekday() (周一=1, 周日=7): {weekday_num_from_1}")
# 手动映射到中文
weekdays_zh_from_1 = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
print(f"今天是: {weekdays_zh_from_1[weekday_num_from_1 - 1]}") # 注意索引要减1
使用 strftime() 格式化
strftime() 方法可以将日期时间对象格式化为字符串,通过特定的格式代码,可以直接获取星期几的名称。
常用格式代码
%A: 返回完整的星期名称(如 "Monday", "Tuesday")。%a: 返回简写的星期名称(如 "Mon", "Tue")。%w: 返回数字,周日为 0,周六为 6。
示例代码:
import datetime
now = datetime.datetime.now()
# 获取完整的星期名称 (e.g., Monday)
full_weekday_name = now.strftime('%A')
print(f"完整的星期名称: {full_weekday_name}")
# 获取简写的星期名称 (e.g., Mon)
short_weekday_name = now.strftime('%a')
print(f"简写的星期名称: {short_weekday_name}")
# 获取数字,周日为0 (e.g., 1 for Monday)
weekday_num_from_0_strftime = now.strftime('%w')
print(f"数字 (周日=0): {weekday_num_from_0_strftime}")
# 获取中文星期几 (需要额外处理)
# 方法1:创建一个中英文映射字典
weekday_map = {
"Monday": "周一",
"Tuesday": "周二",
"Wednesday": "周三",
"Thursday": "周四",
"Friday": "周五",
"Saturday": "周六",
"Sunday": "周日"
}
zh_weekday = weekday_map.get(now.strftime('%A'), "未知")
print(f"中文星期几: {zh_weekday}")
# 方法2:更简洁的列表映射 (假设系统环境是英文)
# 注意:此方法依赖于 strftime('%A') 的输出语言,如果系统语言不是英文则会失效
weekdays_en = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
zh_weekdays = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
try:
index = weekdays_en.index(now.strftime('%A'))
print(f"中文星期几 (列表法): {zh_weekdays[index]}")
except ValueError:
print("无法识别的星期名称")
# 获取中文星期几(推荐且稳定的方法)
# 使用 locale 模块设置语言环境
import locale
# 设置为中文环境 (Windows可能需要 'zh_CN.UTF-8' 或 'chinese')
try:
# 尝试设置系统默认的中文locale
locale.setlocale(locale.LC_TIME, 'zh_CN.UTF-8')
# 或者使用 'chinese' (在某些系统上有效)
# locale.setlocale(locale.LC_TIME, 'chinese')
# 现在strftime('%A')会返回中文
chinese_weekday = now.strftime('%A')
print(f"直接获取中文星期几: {chinese_weekday}")
except locale.Error:
print("无法设置中文locale,请确保系统支持。")
总结与推荐
| 方法 | 返回值 | 说明 | 推荐场景 |
|---|---|---|---|
weekday() |
int (0-6) |
周一为0,周日为6 | 需要进行数字计算或索引操作时。 |
isoweekday() |
int (1-7) |
周一为1,周日为7 | 遵循ISO标准,需要1-7的编号时。 |
strftime('%A') |
str (完整名称) |
返回系统语言环境的星期名称 | 需要显示星期名称(如 "Monday")时。 |
strftime('%a') |
str (简写名称) |
返回系统语言环境的星期简写 | 需要显示简写(如 "Mon")时。 |
如何选择?
-
如果只需要一个数字:
- 想让周一是第一天(0),用
weekday()。 - 想让周一是第一天(1),用
isoweekday()。
- 想让周一是第一天(0),用
-
如果需要显示星期名称:
- 如果你的程序主要在英文环境下运行,直接用
now.strftime('%A')即可。 - 如果你的程序需要显示中文星期几,最稳定可靠的方法是使用
locale模块设置语言环境后再调用strftime('%A'),如果无法设置locale,则采用创建字典映射的方法。
- 如果你的程序主要在英文环境下运行,直接用
获取中文星期几的最佳实践
import datetime
import locale
def get_chinese_weekday(dt_obj):
"""
获取一个datetime对象对应的中文星期几
"""
# 创建一个中英文映射字典,不依赖系统locale
weekday_map = {
"Monday": "周一",
"Tuesday": "周二",
"Wednesday": "周三",
"Thursday": "周四",
"Friday": "周五",
"Saturday": "周六",
"Sunday": "周日"
}
# 获取英文星期名称
en_name = dt_obj.strftime('%A')
# 从字典中查找对应的中文
return weekday_map.get(en_name, "未知")
# --- 使用示例 ---
now = datetime.datetime.now()
# 方法1:使用字典映射 (推荐,稳定)
zh_weekday_1 = get_chinese_weekday(now)
print(f"今天是: {zh_weekday_1}")
# 方法2:使用locale (可能受系统环境影响)
try:
# 尝试设置locale为中文
locale.setlocale(locale.LC_TIME, 'zh_CN.UTF-8')
# 如果成功,strftime('%A')会直接返回中文
zh_weekday_2 = now.strftime('%A')
print(f"今天是: {zh_weekday_2}")
except locale.Error:
print("无法设置中文locale,请检查系统配置。") 