您似乎在这里问了几个单独的问题。
首先,如果你只关心自己机器当前的本地时区,你不需要知道它是什么。只需使用本地到 UTC 功能。API 中有一些漏洞,但即使您找不到所需的功能,您也可以通过 POSIX 时间戳和fromtimestamp
andutcfromtimestamp
方法从本地获取到 UTC,反之亦然。
如果您希望能够处理任何时区,请参阅文档顶部了解感知对象和朴素对象之间的区别,但基本上:感知对象是知道其时区的对象。所以,这就是你需要的。问题是,正如文档所说:
请注意,datetime 模块不提供具体的 tzinfo 类。需要任何详细程度的时区支持取决于应用程序。
支持时区的最简单方法是安装和使用第三方库pytz
。
同时,正如strftime()
Behaviorstrptime()
所解释的那样,strptime
总是返回一个幼稚的对象。然后,您必须调用replace
和/或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 没有内置的帮助。但是有一些不同的第三方库可以这样做,例如dateutil
. 例如:
def RFC3339_to_localHHMM(input):
# Take an XML date (2013-04-08T22:35:00Z)
# return e.g. 08/04 23:35
utc = datetime.datetime.strptime(input, '%Y-%m-%dT%H:%M:%SZ')
bst = utc.astimezone(dateutil.tz.tzlocal())
return bst.strftime('%d/%m %H:%M')
但现在我们绕了一圈。如果您想要的只是本地时区,那么您根本不需要时区(至少对于您的简单用例而言)。因此,仅当您需要支持任何时区并且还希望能够(例如,默认为您的本地时区)时才需要这样做(无需为有意识和幼稚的情况编写所有代码的两个副本)。
(此外,如果您dateutil
首先要使用它,您可能希望将其用于获取时区之外的其他用途——它基本上可以替换您使用datetime
和所做的一切pytz
。)
当然,除了这些库之外还有其他选择——搜索 PyPI、Google 和/或 ActiveState 配方。