指定日期时:
datetime.datetime(2011, 8, 15)
我如何才能知道这是本月的第三周?
如果我想要这个日期怎么办?
datetime.datetime(2011, 2, 28) //should return 4
datetime.datetime(2011, 8, 29) //should return 5
据我所知,如果给定日期是闰年,那么只有2月有4周(bissextile)
答案 0 :(得分:10)
其他答案中显示的模式式方法可能会产生误导。想象一年中的几周。在365天的任何一年中,这是52天的52天,剩下一天。因此,如果我的第一年,第52周结束于12月30日,我还有12月31日担心。
我可以 认为一年有53周,并且第53周是1月31日,1月1日,1月2日,1月3日...或者,更常规地,我考虑明年的第一周实际上是从12月31日开始的。这就是你的日记口袋书的作用。
当然这意味着明年第52周结束时不是12月30日,而是12月29日。 而且每年它会一次又一天地回来,直到第6年我们已经将第52周的结束时间移回了6天(并且在闰日中进行了很好的测量)所以整个2017年的第一周将是包含在2016年,这将是愚蠢的。所以2016年将有53周。
完全相同的逻辑适用于几个月,但它可能更难发现。不幸的是,你选择了2011年8月,这是一个整齐的安排,从一个月的第一天开始。
>>> print calendar.month(2011,8)
August 2011
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
>>> print calendar.month(2011,9)
September 2011
Mo Tu We Th Fr Sa Su
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
8月29日是8月的第5周,但是按照相同的逻辑,9月1日,2日3日也将在8月的第5周,因此不能在9月的第1周。
因此,9月29日的简单划分天数将是9月的第5周,但是看上面的日历,如果9月1日是8月,那么9月29日是第4周9月的。
这完全取决于你对一周开始的定义。
import datetime
import calendar
# I am assuming that the first week of a month starts with the first monday of a month...
#I *think* my logic is OK - if Monday (0) is the start of the week, then
#any dayof the month minus its own day of week (0,1,2...) must be positive
#if that day is on or after the first monday of the month
def week_of_month(tgtdate):
days_this_month = calendar.mdays[tgtdate.month]
for i in range(1, days_this_month):
d = datetime.date(tgtdate.year, tgtdate.month, i)
if d.day - d.weekday() > 0:
startdate = d
break
# now we canuse the modulo 7 appraoch
return (tgtdate - startdate).days //7 + 1
tgtdates = [datetime.date(2011, 8, 29),
datetime.date(2011, 8, 1)
]
for tgtdate in tgtdates:
print tgtdate,
print "is in week %s" % week_of_month(tgtdate)
print calendar.month(tgtdate.year,tgtdate.month)
# 2011-09-29 is in week 4
# 2011-09-01 is in week 0
# September 2011
# Mo Tu We Th Fr Sa Su
# 1 2 3 4
# 5 6 7 8 9 10 11
# 12 13 14 15 16 17 18
# 19 20 21 22 23 24 25
# 26 27 28 29 30
# 2011-08-29 is in week 5
# 2011-08-01 is in week 1
# August 2011
# Mo Tu We Th Fr Sa Su
# 1 2 3 4 5 6 7
# 8 9 10 11 12 13 14
# 15 16 17 18 19 20 21
# 22 23 24 25 26 27 28
# 29 30 31
以上,第0周意味着本周不被视为本月的一部分。因此,1月1日是在8月的第5周。
NB
我想对@unutbu回答发表评论,但我猜我没有足够的分数。 模7方法在2011年9月失败。
>>> d = datetime.date(2011,9,28)
>>> (d.day-1)//7+1
4
>>> d = datetime.date(2011,9,1)
>>>
>>> (d.day-1)//7+1
1
从上面的日历中,9月1日是第一周,但这意味着第28周不能在第4周 - 它必须是第5周,或者第1周是第0周......
答案 1 :(得分:8)
In [115]: d=datetime.datetime(2011, 2, 28)
In [116]: (d.day-1)//7+1
Out[116]: 4
In [117]: d=datetime.datetime(2011, 8, 29)
In [118]: (d.day-1)//7+1
Out[118]: 5
答案 2 :(得分:2)
这个(有点笨拙)的例子,使用日历模块......
import calendar
import datetime
def week(dt):
mth = calendar.monthcalendar(dt.year, dt.month)
for i, wk in enumerate(mth):
if dt.day in wk:
return i + 1
calendar.setfirstweekday(calendar.MONDAY)
week(datetime.datetime(2011, 8, 15)) # 3
week(datetime.datetime(2011, 2, 28)) # 5
week(datetime.datetime(2011, 8, 29)) # 5
......根据OP的预期,2011-02-28的答案是错误的,除非周二开始。
答案 3 :(得分:1)
也许http://labix.org/python-dateutil会有所帮助。
除此之外,它只是数学。
from datetime import datetime, timedelta
def week_of_month(date):
month = date.month
week = 0
while date.month == month:
week += 1
date -= timedelta(days=7)
return week
答案 4 :(得分:1)
这个怎么样?我们给出了我们希望找到一周的日期。我们在一个新变量中将日期重置为该月的第一天。然后,我们在第一天和给定日期创建一年中的一周。从给定日期的isoweek中减去第一个isoweek并添加一个。您添加一个来更正零索引号。这应该给出月中的周数。
import datetime
def _get_week_of_day(date):
first_day = date.replace(day=1)
iso_day_one = first_day.isocalendar()[1]
iso_day_date = date.isocalendar()[1]
adjusted_week = (iso_day_date - iso_day_one) + 1
return adjusted_week
答案 5 :(得分:0)
testdate = datetime.datetime(2011, 2, 28)
weekofmonth = (testdate.day+7-1)/7
一般来说,找到除法的上限:(x / y)的上限=(x + y-1)/ y
答案 6 :(得分:0)
考虑@Usagi的评论:
datetime.datetime(2011, 8, 15) // should return 3
datetime.datetime(2011, 2, 28) // should return 5
datetime.datetime(2011, 8, 29) // should return 5
以下公式管理一个月的第一天不一定是星期一:
(d.day-d.weekday() -2)//7+2
-2和+2允许获得1到6之间的周数
答案 7 :(得分:0)
d = datetime.datetime.today()
year = d.year
month = d.month
last_day = calendar.monthrange(year,month)[1]
d = datetime.datetime(year, month, last_day)
total_week = (d.day-1)//7+1
print(total_week)
答案 8 :(得分:0)
在此处查看答案:https://stackoverflow.com/a/64192858/6089311
struct PerObjBuffer
{
mat4 matrix;
mat4 otherMatrix;
vec4 colour;
int sampleType = 0;
size_t getBufferSize() { return offsetof(PerObjBuffer, sampleType) + sizeof(sampleType); }
void sendToGPU() { memcpy(destination, this, getBufferSize()); }
String shaderStringCode =
R"(layout(binding = 2, std140) uniform perObjectBuffer
{
mat4 WVPMatrix;
mat4 worldMatrix;
vec4 perObjColour;
int texSampleFormat;
};
)";