在Python中调整日期时区的优雅方式

2024-06-06 17:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我的总部在英国,与夏令时英国夏令时和时区打交道。在

我的代码是:

TIME_OFFSET = 1 # 0 for GMT, 1 for BST

def RFC3339_to_localHHMM(input):
                 # Take an XML date (2013-04-08T22:35:00Z)
                 # return e.g. 08/04 23:35
                 return (datetime.datetime.strptime(input, '%Y-%m-%dT%H:%M:%SZ') +
datetime.timedelta(hours=TIME_OFFSET)).strftime('%d/%m %H:%M')

设置一个这样的变量感觉非常错误,但我找不到任何优雅的方法来实现上面没有可怕的代码量。我是不是漏掉了什么东西,或者没有办法(例如)读取系统时区?在


Tags: to代码forinputdatetimereturntimedef
3条回答

要将UTC转换为给定时区:

from datetime import datetime
import pytz

local_tz = pytz.timezone("Europe/London") # time zone name from Olson database

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)

rfc3339s = "2013-04-08T22:35:00Z"
utc_dt = datetime.strptime(rfc3339s, '%Y-%m-%dT%H:%M:%SZ')
local_dt = utc_to_local(utc_dt)
print(local_dt.strftime('%d/%m %H:%M')) # -> 08/04 23:35

另请参见How to convert a python utc datetime to a local datetime using only python standard library?。在

你好像问了几个不同的问题。在

首先,如果你只关心你自己的机器当前的本地时区,你不需要知道它是什么。只需使用本地到UTC函数。API中有一些漏洞,但是即使找不到所需的函数,也可以通过POSIX时间戳和^{}utcfromtimestamp方法从本地到UTC或反之亦然。在

如果您希望能够处理任何时区,请参见the docs的顶部,以了解感知对象和朴素对象之间的区别,但基本上:可感知对象是知道其时区的对象。所以,这就是你需要的。问题是,正如文件所说:

Note that no concrete tzinfo classes are supplied by the datetime module. Supporting timezones at whatever level of detail is required is up to the application.

支持时区的最简单方法是安装和使用第三方库^{}。在

同时,正如^{} and ^{} Behavior所解释的那样,strptime总是返回一个朴素的对象。然后,您必须调用^{}和/或astimezone(取决于字符串是UTC时间还是本地时间)以获得一个带有正确时区的感知对象。在

但是,即使这样,你仍然需要知道你所在的时区,这意味着你仍然需要一个常数。换句话说:

TIMEZONE = pytz.timezone('Europe/London')
def RFC3339_to_localHHMM(input):
    # Take an XML date (2013-04-08T22:35:00Z)
    # return e.g. 08/04 23:35
    utc_naive = datetime.datetime.strptime(input, '%Y-%m-%dT%H:%M:%SZ')
    utc = utc_naive.replace(pytz.utc)
    bst = utc.astimezone(TIMEZONE)
    return bst.strftime('%d/%m %H:%M')

那么,如何让操作系统给你本地时区呢?好吧,对于不同的平台,这是不同的,Python没有内置的帮助。但是有一些不同的第三方库可以做到,比如^{}。例如:

^{pr2}$

但现在我们已经绕了一圈了。如果您只想要本地时区,那么您根本就不需要时区(至少对于您的简单用例而言)。因此,只有当您需要支持任何时区,并且希望能够,例如,默认为您的本地时区(对于有意识和天真的情况,无需编写所有代码的两个副本)。在

(另外,如果您首先要使用dateutil,那么您可能希望使用它不仅仅是为了获取时区,它基本上可以用datetimepytz来替换您正在做的一切。)

当然,除了这些库之外,还有其他选项可以搜索PyPI、Google和/或ActiveState recipes。在

如果要将UTC输入转换为本地时间,无论您在哪个时区,请尝试以下操作:

def utctolocal(input):
    if time.localtime()[-1] == 1: st=3600
    else: st=0
    return time.localtime(time.time()-time.mktime(time.gmtime())+time.mktime(time.localtime(time.mktime(time.strptime(input, '%Y-%m-%dT%H:%M:%SZ'))))+st)

相当长的代码,但它只是简单地增加了时间.gmtime()和时间.本地时间()到从输入创建的时间元组。在

相关问题 更多 >