【问题标题】:Python - Get TimeZone aware First, Last day of the week based on todayPython - 了解时区首先,基于今天的一周的最后一天
【发布时间】:2017-10-06 04:20:11
【问题描述】:

我想根据用户当前时区获取一周中的第一天、最后一天。我正在尝试解决,但我找不到在 python.here 中继续解决的方法。例如,我采用了两个不同的时区。

from datetime import datetime, date, timedelta
from pytz import timezone

tz1 = timezone('utc')
tz2 = timezone('Asia/Kolkata')
tz3 = timezone('America/Los_Angeles')

dt1 = datetime.now(tz=tz1)
dt2 = datetime.now(tz=tz2)
dt3 = datetime.now(tz=tz3)


start_of_week = dt1+timedelta(days=0-dt1.weekday())
end_of_week = dt1+timedelta(days=6-dt1.weekday())

print(start_of_week)
print(end_of_week)

start_of_week2 = dt2+timedelta(days=0-dt2.weekday())
end_of_week2 = dt2+timedelta(days=6-dt2.weekday())

print(start_of_week2)
print(end_of_week2)


start_of_week3 = dt3+timedelta(days=0-dt3.weekday())
end_of_week3 = dt3+timedelta(days=6-dt3.weekday())

print(start_of_week3)
print(end_of_week3)

输出:

2017-10-02 09:21:32.666920+00:00
2017-10-08 09:21:32.666920+00:00
2017-10-02 14:51:32.666920+05:30 # not right
2017-10-08 14:51:32.666920+05:30 # not right
2017-10-02 02:21:32.666920-07:00 # not right
2017-10-08 02:21:32.666920-07:00 # not right

我住在Asia/kolkata,一周开始Oct 01 (Sunday),一周结束Oct 07 (Saturday),这里有什么问题?

【问题讨论】:

  • 那么,您遇到了什么问题?错误,结果不好?
  • 上面的代码不会首先返回,一周的最后一天它只给出周数,但我正在寻找python中可能的解决方案
  • @chakri 谢谢,但它不知道时区,天被硬编码为 timedelta

标签: python


【解决方案1】:

扩展你的代码:

from datetime import datetime, date,timedelta
from pytz import timezone

tz1 = timezone('utc')
tz2 = timezone('Asia/Kolkata')
tz3 = timezone('America/Los_Angeles')

dt1 = datetime.now(tz=tz1)
dt2 = datetime.now(tz=tz2)
print(dt1)
print(dt2)

start_of_week = dt1+timedelta(days=0-dt1.weekday())
end_of_week = dt1+timedelta(days=6-dt1.weekday())

print(start_of_week)
print(end_of_week)

【讨论】:

  • 看起来不错,但是如何制作一个函数并将日期包装在 .date() +1 周围
【解决方案2】:

我正在扩展 chakris 答案:

更新由于一周可以在同一天开始或结束,当您输入星期日和星期以星期日开始时,您有两种选择。

也许您可以更改代码以满足您的需要。

from datetime import datetime, date,timedelta
from pytz import timezone

def week_startandend(dt_,weekstart=0):
    """Returns tuple with start date of week and end day of week."""
    index = (dt_.weekday() + (7-weekstart % 7) ) % 7

    # Calculate start and end
    start = dt_+timedelta(days=0-index)
    end  = dt_+timedelta(days=6-index)

    # if week doesnt start on the same day we can return
    if index != 0:
        return {"start":start.date(),"end":end.date()}
    # else we need to calculate the other option
    else:
        start2 = dt_+timedelta(days=-7)
        end2 = dt_
        return {"start1":start.date(),"end1":end.date(),
                "start2":start2.date(),"end2":end2.date()}

tz1 = timezone('utc')
tz2 = timezone('Asia/Kolkata')

dt1 = datetime.now(tz=tz1)
dt2 = datetime.now(tz=tz2)

print(week_startandend(dt1)) # defaults to 0
print(week_startandend(dt2,weekstart=6)) # 6 = sunday

返回

{'start': datetime.date(2017, 10, 2), 'end': datetime.date(2017, 10, 8)}
{'start1': datetime.date(2017, 10, 8), 'end1': datetime.date(2017, 10, 14),
'start2': datetime.date(2017, 10, 1), 'end2': datetime.date(2017, 10, 8)}

在 [352] 中:

【讨论】:

  • @Srinivas 我认为您复制了错误的代码。该输出是不可能的。
  • 对不起,我复制了@chakri 的答案。更新了我上面的问题。
  • @Srinivas 好的,现在你遇到了真正的问题,这是你想要的吗?应该编辑 ofc 以在一周的所有日子里工作
猜你喜欢
  • 2021-07-21
  • 2021-08-24
  • 2017-07-21
  • 2014-03-08
  • 1970-01-01
  • 2016-07-18
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多