关于时区:Python中的样本Internet时间

Swatch Internet time in python

我有这个代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from time import localtime, timezone


def itime():
   """Calculate and return Swatch Internet Time

    :returns: No. of beats (Swatch Internet Time)
    :rtype: float
   """


    h, m, s = localtime()[3:6]
    beats = ((h * 3600) + (m * 60) + s + timezone) / 86.4

    if beats > 1000:
        beats -= 1000
    elif beats < 0:
        beats += 1000

    return beats

但它没有考虑时区。

如何选择苏黎世作为时区?

服务器在美国,但互联网时间以瑞士为基础


Swatch Internet时间中没有时区,而是使用了新的BIEL同时时间尺度(BMT),该时间尺度基于Swatch在瑞士BIEL的总部,相当于中欧时间、西非时间和UTC+01。参考https://en.wikipedia.org/wiki/swatch_internet_time

但您可以通过以下步骤来实现这一点:

1)-以UTC格式获取当前时间。(现在您不必担心服务器的位置和时间)

2)-将该时间转换为苏黎世时间(苏黎世时间为UTC+2)。

3)-将苏黎世时间转换为datetime.timetuple()

此前,datetime.localtime向您返还了当地时间的timetuple对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from datetime import datetime
from dateutil import tz

def itime():
   """Calculate and return Swatch Internet Time

    :returns: No. of beats (Swatch Internet Time)
    :rtype: float
   """

    from_zone = tz.gettz('UTC')
    to_zone = tz.gettz('Europe/Zurich')
    time = datetime.utcnow()
    utc_time = time.replace(tzinfo=from_zone)
    zurich_time = utc_time.astimezone(to_zone)

    h, m, s = zurich_time.timetuple()[3:6]

    beats = ((h * 3600) + (m * 60) + s) / 86.4

    if beats > 1000:
        beats -= 1000
    elif beats < 0:
        beats += 1000

    return beats

print itime()

希望这有帮助:)