python timestamp date_关于python:获取datetime.datetime.fromtimestamp()使用的时区

有没有可能,如果有,如何获得由datetime.datetime.fromtimestamp()用来将posix时间戳(从epoch开始的秒数)转换为datetime对象的时区(即UTC偏移量或具有该偏移量的datetime.timezone实例)?

datetime.datetime.fromtimestamp()将posix时间戳转换为幼稚的datetime对象(即没有tzinfo对象),但使用系统的区域设置将其调整为本地时区和当时有效的UTC偏移量。

例如,使用日期2008-12-27午夜UTC(自纪元起40*356*86400秒):

>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)

datetime.datetime(2008, 12, 27, 1, 0)

这个时间戳在早上1点被转换成一个datetime对象(当时它在CET/CEST时区中)。100天后,结果是:

>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)

datetime.datetime(2009, 4, 6, 2, 0)

早上两点。这是因为到那时,DST处于活动状态。

我原以为datetime.datetime.fromtimestamp()会设置它在返回的datetime实例中使用的tzinfo,但它没有。

datetime.fromtimestamp(ts)将"从纪元开始的秒数"转换为表示本地时间的简单日期时间对象。在这种情况下,tzinfo总是None。

本地时区过去可能有不同的UTC偏移量。在一些提供历史时区数据库访问的系统上,fromtimestamp()可能会考虑到这一点。

要获取fromtimestamp()使用的UTC偏移量:

utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

另请参见,获取计算机在python中的UTC偏移量。

当我问这个问题的时候,这实际上是我需要的。知道时区规则并不重要,只是UTC时差就足够了。

从python文档中:

classmethod datetime.fromtimestamp(timestamp, tz=None)

Return the local date and time corresponding to the POSIX timestamp, such as is returned by time.time(). If optional argument tz is None or not specified, the timestamp is converted to the platform’s local date and time, and the returned datetime object is naive.

Else tz must be an instance of a class tzinfo subclass, and the timestamp is converted to tz‘s time zone. In this case the result is equivalent to tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

与您的问题相关的这个描述的关键部分是,当您不指定时区时,它不仅使用本地时区,而且结果是幼稚的。你似乎想让它意识到。

这是python所做的一个特别的区别,在datetime文档的最上面就已经讨论过了。

如果您想要的是一个了解本地时区的datetime,请尝试TZLocal库。它集中在那个特定的问题上。另请参见此问题。

是的,我想要一个已知的datetime对象,但是我正在寻找一种不使用任何附加库的方法,因为python显然已经能够访问必要的逻辑来计算与posix时间戳的正确偏移量。

实际上它本身并没有。它依赖于主机环境来提供翻译。因为这是平台特定的,并且不同的平台具有不同的TZ数据库实现,所以它不能将转换规则复制回TZINFO对象。

我知道情况是这样的。但通过C库,它可以访问逻辑,该逻辑可以使用操作系统的设置将UTC偏移量分配给POSIX时间戳(否则问题中的代码将无法工作)。

确切地。它只是无法将该逻辑复制回TZINFO Python对象,因此它无法将其表示为一个感知的日期时间。这就是TZLocal库试图猜测时区规则的原因。它询问操作系统,然后将自己的值赋回TZINFO。没有任何内置功能可以做到这一点。

@feuermurmel:.tm_zone,.tm_gmtoff在所有平台上都不可用。对于某些时区,time.tzname可能会失败。查看我答案中的最后一个链接。TZLocal返回PYTZ时区,这是跨平台解决方案的最佳选择。此外,不同版本的TZ数据库可能为同一时区提供不同的定义——安装纯python-pytz模块允许您控制使用的版本。

使用time.gmtime可以提取时区,如前面的回答所述:用python获取系统的TZ信息?.

>>> from __future__ import print_function

>>> from time import gmtime, strftime

>>> print(strftime("%z", gmtime()))

-0600

在python-2.7和python-3.3中为我的cst笔记本电脑打印-06:00还可以使用local time()获取本地时间结构。

>>> from __future__ import print_function

>>> from time import localtime

>>> lt = localtime()

>>> print(lt.tm_zone)

"CDT"

>>> print(lt.tm_gmtoff/(60*60))

-5.0

>>> print(lt.tm_gmtoff/(60*60) - (1 if lt.tm_isdst == 1 else 0)) # Adjusted for DST

-6.0

希望这有帮助

您不喜欢某个特定的答案(您可以通过单击某个答案下面的"共享"并复制URL来实现),这是什么意思?

你可能是说time.gmtime。在python 3.3中,它打印time.struct_time(tm_year=2008, tm_mon=12, tm_mday=27, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=362, tm_isdst=0)。我看不到时区信息。

哦,你可能是说time.gmtime().tm_gmtoff!它不起作用。它在设置为CEST的系统上返回0。

更改了链接和固定类型,谢谢。

两个注意事项:您的第一个示例是否应该打印+0000,因为gmtimes()的文档说明返回的struct_time是在UTC中?到目前为止,lt.tm_gmtoff似乎是我找到的唯一方法,但这意味着localtime()必须被调用两次(一次由datetime.fromtimestamp()调用),才能创建一个有意识的datetime实例。

strftime("%z")打印本地时区的当前UTC偏移量,无论参数是什么,即gmtime()与此无关。

同时,40 * 356 * 86400时间戳处的UTC偏移量可能与当前的UTC偏移量不同。andtm_gmtoff并非所有系统都可用,请参阅我的答案。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 datetime 模块的 datetime.datetime.fromtimestamp() 函数来将 timestamp 转换为 datetime 类。datetimetimestamp() 函数也可以把 datetime 转换为 timestamp,也可以使用 datetime.timedelta() 来减一天。 ### 回答2: 在Python中,可以使用`timestamp`函数将时间转换为时间戳。不过,要将时间戳减去一天并转换为日期时间对象,可以使用`datetime`模块的`datetime`类。 首先,导入`datetime`模块: ```python import datetime ``` 然后,使用`datetime`类的`utcfromtimestamp`方法将时间戳转换为日期时间对象。注意,`utcfromtimestamp`方法返回的是UTC时间,所以需要调整为本地时间: ```python timestamp = 1562505600 # 假设为时间戳 dt = datetime.datetime.utcfromtimestamp(timestamp) + datetime.timedelta(days=-1) local_dt = dt.replace(tzinfo=datetime.timezone.utc).astimezone(tz=None) ``` 这样,`local_dt`就是原时间戳减去一天后的本地日期时间对象了。 需要注意的是,`datetime`模块中确实没有提供`fromtimestamp`方法,而是提供了`utcfromtimestamp`方法。这是因为时间戳是相对于UTC的,而不是特定的时区。所以,转换为日期时间对象后,需要根据时区调整为本地时间。 ### 回答3: 在Python中,可以使用datetime模块来处理日期和时间相关的操作。如果你有一个timestamp值,并且想要将其减去一天,可以通过以下步骤实现: 首先,你需要导入datetime模块,通过`import datetime`语句来完成。接下来,你可以使用`datetime.fromtimestamp(timestamp)`来将timestamp转化为datetime对象。然而,你提到在datetime模块中没有找到fromtimestamp方法,这可能是因为你正在使用Python版本较早的版本。 在Python中,如果你的版本是较早的版本(低于Python 3.3),可以使用以下方法将timestamp转化为datetime对象: ```python import datetime import time timestamp = time.time() # 获取当前时间的timestamp one_day_delta = datetime.timedelta(days=1) # 定义一天的时间间隔 date_obj = datetime.datetime.fromtimestamp(timestamp) # 将timestamp转化为datetime对象 previous_day = date_obj - one_day_delta # 减去一天的时间间隔 ``` 如果你的Python版本是较新的(Python 3.3及以上),则可以直接使用以下方法将timestamp转化为datetime对象: ```python import datetime timestamp = datetime.datetime.now().timestamp() # 获取当前时间的timestamp date_obj = datetime.datetime.fromtimestamp(timestamp) # 将timestamp转化为datetime对象 previous_day = date_obj - datetime.timedelta(days=1) # 减去一天的时间间隔 ``` 以上是两种常见的方法,根据你的Python版本选择使用其中之一即可。无论哪种方法,都可以将timestamp减去一天并得到相应的日期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值