2

这应该很简单,但我在 Python 中无法完全弄清楚。我想要一个函数,它接受两个参数,一个以秒为单位的 UTC 时间和一个像“欧洲/维也纳”这样的区域信息名称,并以秒为单位返回与本地时间的偏移量和该时间点的 UTC。

在 C 中它将是:

/* ... 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;
}

我想我的问题真的可以归结为:“给定奥尔森时区(例如'欧洲/斯德哥尔摩')和 UTC 时间,当地时间是什么时候?

4

4 回答 4

4

假设“UTC 时间以秒为单位”表示 POSIX 时间戳。要将其转换为斯德哥尔摩时间:

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()如果源时区是 UTC(就像在这种情况下),则不需要。

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

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,则可以使用显式公式:

from datetime import datetime, timedelta
import pytz

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

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

如果时间戳来自本地“正确”源,则应使用前两个示例(它们称为“正确” time.gmtime())。

于 2012-10-02T15:01:47.760 回答
3

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

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

对于以下示例...

now = datetime.utcnow()
print(now)
tzname = 'Europe/Stockholm'
delta = get_diff(now, tzname)
print(delta)
now_in_stockholm = now + delta
print(now_in_stockholm)

...输出:

2012-10-02 14:38:56.547475
2:00:00
2012-10-02 16:38:56.547475
于 2012-10-02T14:45:26.100 回答
3

这已经很老了,但我找不到一个很好的答案,所以这就是我想出的:

from datetime import datetime
local = datetime.now()
utc = datetime.utcnow()
int((local - utc).days * 86400 + round((local - utc).seconds, -1))

回报:

-21600

因为我(目前)落后于 UTC 21600 秒(6 小时)。

注意:计算的第二个日期(在这种情况下为 UTC)需要四舍五入,因为每次计算的时间差异非常小。

于 2018-05-16T17:08:06.590 回答
1

我想我的问题真的可以归结为:“给定奥尔森时区(例如'欧洲/斯德哥尔摩')和 UTC 时间,当地时间是什么时候?

如果我正确理解您的问题:

from pytz import timezone
import datetime, time

tz = timezone('Asia/Kuwait')
utc_dt = datetime.datetime.utcfromtimestamp(time.time())
utc_dt + tz.utcoffset(utc_dt)

>>> tz.utcoffset(utc_dt).seconds
10800
>>> tz
<DstTzInfo 'Asia/Kuwait' LMT+3:12:00 STD>
>>> utc_dt + tz.utcoffset(utc_dt)
datetime.datetime(2012, 10, 2, 17, 13, 53, 504322)
>>> utc_dt
datetime.datetime(2012, 10, 2, 14, 13, 53, 504322)
于 2012-10-02T14:19:22.027 回答