【问题标题】:Determining "days" in python when the timedelta.days is less than one当 timedelta.days 小于 1 时在 python 中确定“天数”
【发布时间】:2013-01-31 21:29:13
【问题描述】:

如果这很密集,请提前抱歉。我试图找出自上次发布推文以来的日子。我遇到的问题是日期不同时,例如今天和昨天,但时间不足以成为完整的“一天”。

# "created_at" is part of the Twitter API, returned as UTC time. The 
# timedelta here is to account for the fact I am on the west coast, USA 
lastTweetAt =  result.created_at + timedelta(hours=-8)

# get local time
rightNow = datetime.now()

# subtract the two datetimes (which gives me a timedelta)
dt = rightNow - lastTweetAt

# print the number of days difference
print dt.days

问题是,如果我昨天下午 5 点发布了一条推文,而今天上午 8 点运行脚本,则只过去了 15 个小时,即 0 天。但很明显,如果是昨天,我想说距离我上一条推文已经过去了 1 天。添加“+1”的杂乱无章也无济于事,因为如果我今天发了推文,我希望结果为 0。

有没有比使用 timedelta 更好的方法来获得差异?


解决方案 由 Matti Lyra 提供

答案是在日期时间上调用 .date() 以便将它们转换为更粗略的日期对象(没有时间戳)。正确的代码如下:

# "created_at" is part of the Twitter API, returned as UTC time.
# the -8 timedelta is to account for me being on the west coast, USA
lastTweetAt =  result.created_at + timedelta(hours=-8)

# get UTC time for right now
rightNow = datetime.now()

# truncate the datetimes to date objects (which have dates, but no timestamp)
# and subtract them (which gives me a timedelta)
dt = rightNow.date() - lastTweetAt.date()

# print the number of days difference
print dt.days

【问题讨论】:

  • 那么看dt.seconds有什么问题?
  • 尝试rightNow = datetime.utcnow() 避免手动管理时区(假设您有正确的本地时间/时区设置)
  • .seconds 没有帮助,因为我想知道推文之间的 。如果我在晚上 11 点发布推文并在凌晨 1 点(2 小时后)运行脚本,我希望返回“1”。但是,如果我在凌晨 1 点发布推文并在凌晨 3 点运行脚本,我希望返回“0”。 .seconds 会出现与 .days 相同的问题。 utcnow() 很好,但是无论我将推文的时间转换为本地时间还是将本地时间转换为 UTC,都只是一个六分之一,另一个六分之一。
  • 考虑到更多 TokenMacGuy,我应该将 Twitter 的 UTC 时间转换为我的时间,因为执行与发布的差异应该与我有关。当我在太平洋时间下午 5 点发布推文时,Twitter 会返回一个日期时间为第二天凌晨 1 点的响应。如果我在太平洋时间凌晨 1 点运行脚本,那么它将计算 1 AM UTC(推文)和 9 AM UTC(脚本执行)之间的差异,这会导致返回 0 天的差异。但我希望它说 1 天,因为我在当地时间凌晨 1 点(午夜之后)运行它,而最后一条推文是在前一天下午 5 点。

标签: python date datetime timedelta


【解决方案1】:

只处理日期时间的“日期”部分怎么样?

以下代码中输出“0”后的部分:

>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now() - datetime.timedelta(hours=20)
>>> (a-b).days
0
>>> b.date() - a.date()
datetime.timedelta(-1)
>>> (b.date() - a.date()).days
-1

【讨论】:

    【解决方案2】:

    您可以使用datetime.date() 比较两个日期(注意:不是日期与时间),这会将datetime 截断为以天而不是小时为分辨率。

    ...
    # subtract the two datetimes (which gives me a timedelta)
    dt = rightNow.date() - lastTweetAt.date()
    ...
    

    文档永远是你的朋友

    http://docs.python.org/2/library/datetime#datetime.datetime.date

    【讨论】:

    • 呸,我正好在发这个……+1​​
    • 正是它试图记住的……漫长的一天。 +1
    • 啊啊啊——我们走了。我非常担心我没有考虑的 UTC 与本地问题 - 并且相信我看过文档,我发誓! - 一旦我有了正确的日期,就转换回更粗略的粒度。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多