在Python中,如何获取前一天的Unix时间戳?

14

我在PST时区。 我想获取2个时间戳:

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

这些时间戳应该与当前时间无关。

如何使用Python做到这一点?

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


1
你不一定非要使用 datetime 对象,但是为什么不想使用呢? - abarnert
1
如果时间戳是针对两个不同的时间点,它们怎么可能相同呢? - Matt Johnson-Pint
3
“昨天结束”是指“今天开始”吗?还是指午夜前一瞬间(秒/毫秒/纳秒)? - Matt Johnson-Pint
3
@MattJohnson说的是,在任何给定的时间,返回的一对时间戳应该与在同一天的任何其他时间返回的一对时间戳相同。而不是相互之间相同。 - abarnert
你是否需要处理时钟前进和后退的日子?它们会使本来可以做到的事情变得复杂,因为大多数情况下,您需要在开始时间上添加86399秒以获得结束时间,除非您需要添加86399±3600秒。您可能会更好地使用第二天的开始时间作为结束时间(86400±3600),并编写代码来排除结束时间。这避免了关于午夜前最后一秒发生什么的尴尬问题。 - Jonathan Leffler
显示剩余5条评论
2个回答

27

要获取昨天,我猜你可以这样做:

>>>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 = yesterday.strftime(“%s”)和00处出现错误,在unix_time = yesterday.strftime(“%S”)处出现错误。 - crustycollins
1
需要注意的是,尽管它看起来像“数字”,但实际上返回的是一个“字符串”。 - yeliabsalohcin

1
明显的方法是使用 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)

如果您在跟踪闰秒的平台上运行此代码,并且在闰秒期间运行它,它将给出今天而不是昨天。您可以轻松检查这一点(基本上,如果今天等于昨天,则再减去一天),但我认为这并不值得。另外,如果您在夏令时交换期间运行此代码,并且交换发生在午夜和01:00或23:00之间(取决于您所在的半球),则会得到错误的日期。例如,在巴西,如果您在2013年2月16日的第二个23:00-00:00小时内运行此代码,则会返回包括24小时前时间的那一天的开始...即今天,而不是昨天。在此处也适用相同的解决方法。

1
是的,有像你所描述的那样跨越时区的情况。例如,巴西 - Matt Johnson-Pint
@MattJohnson:看起来你是对的;在巴西,在2月16日的第二个23:00-00:00期间,这段代码将返回今天而不是昨天(假设is_dst正常工作)。让我编辑答案。谢谢。 - abarnert
1
  1. time.gmtime 接受一个参数:秒数,而不是年、月、日。 2) 如果你声明唯一正确的答案是半开区间,则包括今天第一时刻的“结束”值。这对于 start < time_yesterday < end 是正确的,但对于任何想要使用 end 和昨天的命名元组(如 end.tm_mon end.tm_day 等)的逻辑都是不正确的。 3) OP 没有明确表示他不想使用 datetime。 4) 你的逻辑将会因为 time.time() 返回的秒的小数部分而出错。
- the wolf
@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()不会立即运行...那又怎样? - abarnert
@thewolf:另外,请注意没有人使用 end;他明确想要一个时间戳,这只是一个数字,所以我正在返回它。一对时间戳必须被解释为半开区间;唯一的其他选择是返回今天午夜之前的上一个实数,但根据定义不存在“上一个实数”。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接