【问题标题】:Time - get yesterdays date时间 - 获取昨天的日期
【发布时间】:2015-04-23 17:59:34
【问题描述】:

我正在尝试使用 Python 的 time 模块来获取今天和昨天的时间。

这对我来说适用于今天的日期:

dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y')

但我不知道如何获取昨天的日期。 我发现很多教程都使用了datetime 模块,但没有使用time 模块。

我该怎么做?有没有更好的方法来获取今天的日期 (struct_time)?

【问题讨论】:

  • 你可以查看这个答案:stackoverflow.com/a/441152/870769
  • @sthzg 感谢您的回答,但使用的是日期时间模块,而不是时间。
  • 如何从不支持日期的类中获取日期?
  • 忘记我的最后一条评论吧,Python 有两个完全不同的东西名为 time,这令人难以置信。
  • 我明白了,我添加了一个在timedatetime 之间来回转换的答案。希望它符合您的用例。

标签: python datetime time


【解决方案1】:

首先,有一种更直接的方法可以获取当前日期:

dt = time.localtime()

要获得前一天的日期,您需要从当前时间减去 24 小时。这可能会在 DST 转换方面出现一些小故障,但我会将这些作为练习留给读者。

dt = time.localtime(time.time() - 86400)

【讨论】:

【解决方案2】:

要获取昨天的struct_time,请使用多个existing datetime solutions 中的任何一个并调用.timetuple() 以获取struct_time,例如:

#!/usr/bin/env python
from datetime import date, timedelta

today = date.today()
yesterday = today - timedelta(1)
print(yesterday.timetuple())
# -> time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=112, tm_isdst=-1)

即使在 DST 转换前后,它也会在当地时区生成正确的日期。

如果您想查找相应的 UTC 时间,请参阅 How can I subtract a day from a python date?(获取昨天作为感知 datetime 对象)。


您也可以只使用 time 模块(但不那么直接)获得昨天:

#!/usr/bin/env python
import time

def posix_time(utc_time_tuple):
    """seconds since Epoch as defined by POSIX."""
    # from https://gist.github.com/zed/ff4e35df3887c1f82002
    tm_year = utc_time_tuple.tm_year - 1900
    tm_yday = utc_time_tuple.tm_yday - 1
    tm_hour = utc_time_tuple.tm_hour
    tm_min = utc_time_tuple.tm_min
    tm_sec = utc_time_tuple.tm_sec
    # http://pubs.opengroup.org/stage7tc1/basedefs/V1_chap04.html#tag_04_15
    return (tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
            (tm_year-70)*31536000 + ((tm_year-69)//4)*86400 -
            ((tm_year-1)//100)*86400 + ((tm_year+299)//400)*86400)

now = time.localtime()
yesterday = time.gmtime(posix_time(now) - 86400)
print(yesterday)
# -> time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=22, tm_min=6, tm_sec=16, tm_wday=2, tm_yday=112, tm_isdst=0)

它假定time.gmtime() 接受给定平台上的 POSIX 时间戳(Python's stdlib breaks otherwise 例如,如果使用非 POSIX TZ=right/UTC)。 calendar.timegm() 可以用来代替posix_time(),但前者可以在内部使用datetime

注意:yesterday 代表两种解决方案中的本地时间(gmtime() 只是在这里实现减法的一种简单方法)。两种解决方案都使用天真的时区不感知时间对象,因此结果可能是不明确的,甚至不存在时间,尽管除非本地时区昨天跳过(例如,俄罗斯在 1918 年 2 月跳过了几天),那么无论如何日期都是正确的。

【讨论】:

    【解决方案3】:

    如果给定了time 对象,可以先将其转换为datetime

    >>> import time
    >>> import datetime
    
    >>> dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y')
    >>> # base time object: time.struct_time(tm_year=2015, tm_mon=4, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=113, tm_isdst=-1)
    
    >>> a_datetime_obj = datetime.datetime.fromtimestamp(time.mktime(dt))
    >>> # convert to datetime: 2015-04-23 00:00:00
    
    >>> minus_one = a_datetime_obj - datetime.timedelta(days=1)
    >>> # subtract one day: 2015-04-22 00:00:00
    
    >>> print minus_one.timetuple()
    >>> # get time object from datetime: time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=112, tm_isdst=-1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2011-03-31
      • 2014-02-27
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多