【问题标题】:In Python, how can I get the Unix timestamp of the day before?在 Python 中,如何获取前一天的 Unix 时间戳?
【发布时间】:2013-07-03 23:57:12
【问题描述】:

我在太平洋标准时间。我想获得 2 个时间戳:

  1. 昨天的开始
  2. 昨天的结束

无论当前是什么时间,这些时间戳都应该是相同的。

如何用 Python 做到这一点?

我必须使用datetime 对象,然后将其转换为时间戳吗?

【问题讨论】:

  • 你没有必须使用datetime对象,但是……你为什么不想要使用?
  • “昨天的开始”是什么意思
  • 两个不同时间点的时间戳怎么可能相同?
  • “昨天结束”是指“今天开始”吗?或者你的意思是午夜前一(秒?/毫秒?/纳秒?)?
  • @MattJohnson:他是说在任何给定时间返回的时间戳对应该与同一天任何其他时间返回的时间戳对相同。 彼此不同

标签: python datetime time


【解决方案1】:

要获得yesterday,我想你可以这样做:

>>>import datetime
>>>yesterday = datetime.date.today() - datetime.timedelta(1)
>>>unix_time= yesterday.strftime("%s") #Second as a decimal number [00,61] (or Unix Timestamp)
>>>print unix_time
'1372737600'

【讨论】:

  • 在 python 2.7 上这对我不起作用。它给 unix_time=昨天.strftime("%s") 和 00 错误 unix_time=昨天.strftime("%S")
【解决方案2】:

执行此操作的明显方法是使用datetime。但是您显然出于某种奇怪的原因想要避免这种情况。嗯,你可以改用timecalendar,或者各种第三方库,或者自定义代码。

这里是time:

import time

def yesterday():
    now = time.time()
    yday = time.localtime(now - 86400) # seconds/day
    start = time.struct_time((yday.tm_year, yday.tm_mon, yday.tm_mday, 0, 0, 0, 0, 0, yday.tm_isdst))
    today = time.localtime(now)
    end = time.struct_time((today.tm_year, today.tm_mon, today.tm_mday, 0, 0, 0, 0, 0, today.tm_isdst))
    return time.mktime(start), time.mktime(end)

如果您在闰秒期间运行此程序,在跟踪闰秒的平台上,它将提供今天而不是昨天。您可以轻松检查(基本上,如果今天 == 昨天,则减去另一天),但我认为这不值得。

此外,如果您在 DST 交叉期间在午夜和 01:00 或 23:00 之间(取决于您的半球)发生交叉的时区运行此命令,则会得到错误的日期。例如,在 Brazil 中,如果您在 2013 年 2 月 16 日的第二个 23:00-00:00 小时内运行此代码,它将返回包含 24 小时前的时间的一天的开始......比昨天。相同的解决方法在这里有效。

【讨论】:

  • 是的,正如您所描述的,有些时区会发生转换。例如,Brazil
  • @MattJohnson:看起来你是对的;在巴西,在 2 月 16 日的第二个 23:00-00:00 期间,此代码将在今天而不是昨天返回(假设 is_dst 工作正常)。让我编辑答案。谢谢。
  • 1) time.gmtime 接受一个参数:秒,而不是年、月、日。 2)如果您声明唯一正确的答案是半开范围,这包括今天第一时刻的“结束”值。这对于start < time_yesterday < end 是正确的,但对于使用end 和昨天的命名元组(如end.tm_mon end.tm_day 等)可能想要使用的任何逻辑都不正确 3)OP 没有具体说他不想使用日期时间 4)您的逻辑将在time.time()返回的秒数内关闭
  • @thewolf: 1) 抱歉,应该是struct_time;固定的。 2)不,半开范围是start <= time < end,而不是start < time。 3) OP 说“我必须使用 DateTime 对象吗?”这意味着他不想使用它。但是,以防我推错了,第一句话是“最明显的方法是使用datetime。” 4)如果你指的是微秒部分,不,那没有任何区别; HH:MM:SS.999999 始终与 HH:MM:SS.000000 在同一天。如果您的意思是 time.time() 不会立即运行……那又如何?
  • @thewolf:另外,请注意没有人使用end;他明确想要一个时间戳,这只是一个数字,所以这就是我要返回的。一对时间戳必须被解释为半开范围;唯一的另一种选择是将先前的实数返回到今天的午夜,根据定义,不存在“先前的实数”这样的东西。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2015-11-18
相关资源
最近更新 更多