首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据时区和UTC时间,获取该时间点的秒数与本地时间的差值

根据时区和UTC时间,获取该时间点的秒数与本地时间的差值
EN

Stack Overflow用户
提问于 2012-10-02 21:20:14
回答 4查看 6K关注 0票数 2

这应该很简单,但是我不能用Python来理解它。我希望有一个函数,它有两个参数,一个是以秒为单位的UTC时间,另一个是类似于‘欧洲/维也纳’的zoneinfo name,并返回当地时间和该时间点的偏移量(以秒为单位)。

在C中,它将是:

代码语言:javascript
复制
/* ... code to to set local time to the time zone I want to compare against,
   not shown here. Then call function below to get difference vs localtime.
   Hardly an ideal solution,
   but just to demonstrate what I want in a "lingua franca" (C): */


int get_diff_vs_localtime(const time_t original_utc_time)
{
    struct tm* ts;

    ts = localtime(&original_utc_time);

    return mktime(ts) - original_utc_time;
}

我想我的问题实际上可以归结为:“给定Olson timezone (例如‘欧洲/斯德哥尔摩’)和UTC时间,当地时间是什么?”

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-02 23:01:48

假设"UTC时间(以秒为单位)“表示POSIX时间戳。要将其转换为斯德哥尔摩时间,请执行以下操作:

代码语言:javascript
复制
from datetime import datetime
import pytz

tz = pytz.timezone('Europe/Stockholm')

utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc)
dt = tz.normalize(utc_dt.astimezone(tz))
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

如果源时区为协调世界时(如本例所示),则不需要tz.normalize()

一种更简单的替代方法是使用fromtimestamp()tz参数,将“自纪元以来的秒数”转换为本地时间:

代码语言:javascript
复制
from datetime import datetime
import pytz

tz = pytz.timezone('Europe/Stockholm')

dt = datetime.fromtimestamp(posix_timestamp, tz)
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

这两个示例产生相同的结果。

如果本地机器使用“正确的”时区,那么要将从外部源接收的POSIX时间戳转换为UTC,可以使用一个显式公式:

代码语言:javascript
复制
from datetime import datetime, timedelta
import pytz

utc_dt = datetime(1970, 1, 1, tzinfo=pytz.utc) + timedelta(seconds=posix_timestamp)

最新的公式还可能支持更大的日期范围(1970年之前、2038年之后或3000年之前的日期不太可能出现问题)。

如果时间戳来自本地的"right“源,那么应该使用前两个示例(它们称为"right”time.gmtime())。

票数 4
EN

Stack Overflow用户

发布于 2012-10-02 22:45:26

您可以使用pytzdatetime以如下方式执行某些操作:

代码语言:javascript
复制
from datetime import datetime
from pytz import timezone

def get_diff(now, tzname):
    tz = timezone(tzname)
    utc = timezone('UTC')
    utc.localize(datetime.now())
    delta =  utc.localize(now) - tz.localize(now)
    return delta

下面的例子..。

代码语言:javascript
复制
now = datetime.utcnow()
print(now)
tzname = 'Europe/Stockholm'
delta = get_diff(now, tzname)
print(delta)
now_in_stockholm = now + delta
print(now_in_stockholm)

..。输出:

代码语言:javascript
复制
2012-10-02 14:38:56.547475
2:00:00
2012-10-02 16:38:56.547475
票数 3
EN

Stack Overflow用户

发布于 2018-05-17 01:08:07

这是相当古老的,但我找不到一个很好的答案,所以这是我想出来的:

代码语言:javascript
复制
from datetime import datetime
local = datetime.now()
utc = datetime.utcnow()
int((local - utc).days * 86400 + round((local - utc).seconds, -1))

返回:

代码语言:javascript
复制
-21600

因为我(目前)比协调世界时晚了21600秒(6小时)。

注意:计算的第二个日期(在本例中为UTC)需要进行四舍五入,因为每次计算的时间差都非常小。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12691081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档