当前位置: 首页 > 知识库问答 >
问题:

python将localtime中的字符串转换为UTC纪元时间戳

巫马玉堂
2023-03-14

我有YMD hms格式的字符串,它去掉了时区。但我知道他们是在东部时间夏令时。

我试图将它们转换为UTC时间的历元时间戳。

我编写了以下函数:

def ymdhms_timezone_dst_to_epoch(input_str,  tz="US/Eastern"):
    print(input_str)
    dt = datetime.datetime.fromtimestamp(time.mktime(time.strptime(input_str,'%Y-%m-%d %H:%M:%S')))
    local_dt = pytz.timezone(tz).localize(dt)
    print(local_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
    utc_dt = local_dt.astimezone(pytz.utc)
    print(utc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))    
    e = int(utc_dt.strftime("%s"))
    print(e)
    return e

Given string `2015-04-20 21:12:07` this prints:

    2015-04-20 21:12:07
    2015-04-20 21:12:07 EDT-0400 #<- so far so good?
    2015-04-21 01:12:07 UTC+0000 #<- so far so good?
    1429596727

这看起来符合时代时间戳。但是http://www.epochconverter.com/epoch/timezones.php?epoch=1429596727说它应该在格林威治时间4月21 2015 06:12:07UTC。

怎么了?

共有3个答案

曹镜
2023-03-14

我不知道为什么,但您必须在使用%s打印之前从utc_dt中删除时区信息。

e = int(utc_dt.replace(tzinfo=None).strftime("%s"))
print(e)
return e
胡云瀚
2023-03-14

首先,并非所有平台都支持'%s',因为平台C库的strftime()函数(由Python调用)支持它,所以它实际上对您有效。这个函数很可能是导致问题的原因,我猜它没有时区意识,因此当从历元时间中提取差异时,它使用的是您的本地时区,这很可能是EST(?)

不要依赖于'%s',它只适用于少数平台(我相信是linux),而应该手动减去从epoch(1970/1/1 00:00:00)获得的日期时间,以获得自epoch以来的实际秒数。范例-

e = (utc_dt - datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.utc)).total_seconds()

演示-

>>> (utc_dt - datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.utc)).total_seconds()
1429578727.0

这与您获得的日期时间正确对应。

余铭晨
2023-03-14

我有YMD hms格式的html" target="_blank">字符串,删除了时区。但我知道它们是东部时间和夏令时。

可移植的方法是使用pytz

#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz

naive_dt = datetime.strptime('2015-04-20 21:12:07', '%Y-%m-%d %H:%M:%S')
tz = pytz.timezone('US/Eastern')
eastern_dt = tz.normalize(tz.localize(naive_dt))
print(eastern_dt)
# -> 2015-04-20 21:12:07-04:00

我试图将它们转换为UTC时间的历元时间戳。

timestamp = (eastern_dt - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
# -> 1429578727.0

请参阅在Python中将datetime.date转换为UTC时间戳。

代码中存在多个问题:

>

时间。mktime()datetime。fromtimestamp()如果无法访问系统(尤其是Windows)上的历史时区数据库,则过去/将来的日期可能会失败

localize(dt)可能会对不明确或不存在的时间返回错误的结果,即在DST转换期间。如果知道时间对应于夏季时间,则使用isdst=True<代码>tz。这里需要normalize(),以调整输入中可能不存在的时间

utc_dt.strftime("%s")不可移植,它不尊重tzinfo对象。它将输入解释为本地时间,即除非您的本地时区是UTC,否则它会返回错误的结果。

我可以一直设置is_dst=True吗?

如果你不介意在不明确或不存在的时间得到不精确的结果,例如,美国/纽约时区秋季有DST转换:

>>> from datetime import datetime
>>> import pytz # $ pip install pytz
>>> tz = pytz.timezone('America/New_York')
>>> ambiguous_time = datetime(2015, 11, 1, 1, 30)
>>> time_fmt = '%Y-%m-%d %H:%M:%S%z (%Z)'
>>> tz.localize(ambiguous_time).strftime(time_fmt)
'2015-11-01 01:30:00-0500 (EST)'
>>> tz.localize(ambiguous_time, is_dst=False).strftime(time_fmt) # same
'2015-11-01 01:30:00-0500 (EST)'
>>> tz.localize(ambiguous_time, is_dst=True).strftime(time_fmt) # different
'2015-11-01 01:30:00-0400 (EDT)'
>>> tz.localize(ambiguous_time, is_dst=None).strftime(time_fmt) 
Traceback (most recent call last):
...
pytz.exceptions.AmbiguousTimeError: 2015-11-01 01:30:00

时钟倒转到2a。m、 在11月的第一个星期天:

is_dst消歧标志可以有三个值:

  • False——默认值,假设为冬季时间

is_dst值对于现有唯一的本地时间被忽略。

当地时间在折叠中重复两次(夏季时间-折叠前,冬季时间-折叠后)。

为了能够自动消除当地时间的歧义,您需要一些额外的信息,例如,如果您阅读了一系列当地时间,那么如果您知道这些时间已排序,则可能会有所帮助:在观察夏令时的同时,解析当地时间(UTC)中排序的时间戳。

 类似资料:
  • 问题内容: 我一直在寻找一种将字符串(以纪元时间)转换为日期的方法。 基本上,我需要使用this:(以字符串形式)并将其放入this:中。 我一直在看strptime和strftime,但似乎都没有为我工作。有什么建议么? 编辑:谢谢,伙计们。我将其转换为int ,将其转换为,然后在其上运行。完美地工作! 问题答案: 如果只有该值是整数而不是字符串,则可以调用。如果只有某种方法可以将字符串转换为整

  • 问题内容: 我已经多次看到这个问题,似乎没有答案是我需要的。 我有一个长类型变量,其中存储了一个纪元时间。 我想做的就是将其转换为字符串 例如,如果存储的纪元时间是今天,那么最后的字符串将显示为: 2012年3月17日 我将如何处理? 问题答案: 看看SimpleDateFormat

  • 问题内容: 我有这个约会时间,或类似的东西。 我想将其转换为时间对象,但除了以下方面,我无法产生任何输出: 我已经尝试过以下布局: 还有更多-没有一个起作用。 这就是我所说的: 如何从字符串创建时间对象? 问题答案: 您很可能使用了错误的布局,并且没有检查返回的错误。 布局必须是此日期/时间,格式为您输入的时间为: 请参阅以下工作代码: 输出(在Go Playground上尝试): 编辑: 在您的

  • 问题内容: 如何将本地时间的datetime 字符串转换为UTC时间的字符串? 我确定我之前已经做过,但是找不到它,因此SO希望将来可以帮助我(和其他人)做到这一点。 澄清:例如,如果我2008-09-17 14:02:00在本地时区(+10)中,我想生成一个等效UTC时间的字符串:2008-09-17 04:02:00。 另外,从http://lucumr.pocoo.org/2011/7/15

  • 问题内容: 我从来没有不得不将时间与UTC转换。最近有人要求我的应用注意时区,并且我一直在圈子里奔波。我发现很多有关将本地时间转换为UTC的信息,这很基本(也许我也做错了),但是我找不到任何有关将UTC时间轻松转换为最终用户时区的信息。 简而言之,android应用程序向我发送了(appengine应用程序)数据,该数据中包含时间戳。要将时间戳存储为UTC时间,我正在使用: 那似乎行得通。当我的应

  • 你能帮我写正确的SQL查询吗。