如何在给定日期的情况下获取星期几?

899

我想要找到以下内容: 给定一个日期(datetime 对象),对应的星期几是什么?

例如,星期天是第一天,星期一是第二天……以此类推。

如果输入是今天的日期,该怎么办。

示例

>>> today = datetime.datetime(2017, 10, 20)
>>> today.get_weekday()  # what I look for

输出可能为6(因为今天是星期五)

31个回答

10

datetime库有时在使用strptime()函数时会出现错误,因此我转而使用dateutil库。以下是如何使用它的示例:

from dateutil import parser
parser.parse('January 11, 2010').strftime("%a")

你会得到的输出是'Mon'。如果你想要输出为 'Monday',可以使用以下代码:

parser.parse('January 11, 2010').strftime("%A")

这对我来说相当快速。我在使用datetime库时遇到了问题,因为我想存储星期几的名称而不是星期几的数字,并且使用datetime库的格式导致了问题。如果您没有遇到这个问题,那太棒了!但如果您有这个问题,您肯定可以选择这个方法,因为它具有更简单的语法。希望这能帮到您。


8

这段代码不需要星期几的注释。
我推荐使用这段代码~!

import datetime


DAY_OF_WEEK = {
    "MONDAY": 0,
    "TUESDAY": 1,
    "WEDNESDAY": 2,
    "THURSDAY": 3,
    "FRIDAY": 4,
    "SATURDAY": 5,
    "SUNDAY": 6
}

def string_to_date(dt, format='%Y%m%d'):
    return datetime.datetime.strptime(dt, format)

def date_to_string(date, format='%Y%m%d'):
    return datetime.datetime.strftime(date, format)

def day_of_week(dt):
    return string_to_date(dt).weekday()


dt = '20210101'
if day_of_week(dt) == DAY_OF_WEEK['SUNDAY']:
    None

7
假设给定日期的日、月和年份,您可以这样做:
import datetime
DayL = ['Mon','Tues','Wednes','Thurs','Fri','Satur','Sun']
date = DayL[datetime.date(year,month,day).weekday()] + 'day'
#Set day, month, year to your value
#Now, date is set as an actual day, not a number from 0 to 6.

print(date)

1
不需要使用DayL数组,因为您可以直接使用strftime(“%A”)而不是weekday()来获取星期几的名称。 - Lekr0

6
如果您有避免使用datetime模块的理由,那么这个函数可以使用。
注意:从儒略历到公历的转换被假定发生在1582年。如果对于您感兴趣的日历来说这不是真实的情况,则需要相应地更改if year > 1582:这一行。
def dow(year,month,day):
    """ day of week, Sunday = 1, Saturday = 7
     http://en.wikipedia.org/wiki/Zeller%27s_congruence """
    m, q = month, day
    if m == 1:
        m = 13
        year -= 1
    elif m == 2:
        m = 14
        year -= 1
    K = year % 100    
    J = year // 100
    f = (q + int(13*(m + 1)/5.0) + K + int(K/4.0))
    fg = f + int(J/4.0) - 2 * J
    fj = f + 5 - J
    if year > 1582:
        h = fg % 7
    else:
        h = fj % 7
    if h == 0:
        h = 7
    return h

1
努力了!您可以将类似于分配给 fgfj 的语句移动到条件内部,以防止不必要的计算。 - Tom Russell

5

如果您不仅仅依赖于datetime模块,那么calendar可能是更好的选择。例如,以下代码将为您提供日期代码:

calendar.weekday(2017,12,22);

这个将会给你当天的日期:

days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
days[calendar.weekday(2017,12,22)]

或者使用Python风格,作为一行代码实现:
["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"][calendar.weekday(2017,12,22)]

4
import datetime
int(datetime.datetime.today().strftime('%w'))+1

这应该可以给你真实的日期编号-1=星期日,2=星期一等等...

为什么要使用 +1?在 Python 中,星期编号从周日开始为 0,周一为 1,这是常识。 - Nebulosar

3

以下是将小端字符串日期列表转换为datetime的方法:

import datetime, time
ls = ['31/1/2007', '14/2/2017']
for d in ls:    
    dt = datetime.datetime.strptime(d, "%d/%m/%Y")
    print(dt)
    print(dt.strftime("%A"))

3

这是一种全新的方式。星期天用数字0表示。

from datetime import datetime
today = datetime(year=2022, month=6, day=17)
print(today.toordinal()%7)  # 5
yesterday = datetime(year=1, month=1, day=1)
print(today.toordinal()%7)  # 1

这比以字符串格式进行更符合我的目的 - Shravya Boggarapu

3
为了将星期日表示为1,星期六表示为7,这是你问题的最简单解决方案:
datetime.date.today().toordinal()%7 + 1

所有的它们:

import datetime

today = datetime.date.today()
sunday = today - datetime.timedelta(today.weekday()+1)

for i in range(7):
    tmp_date = sunday + datetime.timedelta(i)
    print tmp_date.toordinal()%7 + 1, '==', tmp_date.strftime('%A')

输出:

1 == Sunday
2 == Monday
3 == Tuesday
4 == Wednesday
5 == Thursday
6 == Friday
7 == Saturday

问题要求星期天等于1,星期一等于2,星期五等于6。 - ox.

3
import datetime
import calendar

day, month, year = map(int, input().split())
my_date = datetime.date(year, month, day)
print(calendar.day_name[my_date.weekday()])

输出示例

08 05 2015
Friday

但是在2015年05月08日星期三。 - DikShU
输入的格式是DD MM YYYY,也许你把它解释成了MMDDYYYY格式。 - nsky80

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接