如何记录时区
%Z
从strftime格式
视窗
>>> import logging
>>> logging.basicConfig(format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p %Z")
>>> logging.error('test')
11/03/2017 02:29:54 PM Mountain Daylight Time test
Linux
>>> import logging
>>> logging.basicConfig(format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p %Z")
>>> logging.error('test')
11/03/2017 02:30:50 PM MDT test
如果问题是
如何登录与服务器本地时间不同的时区?
部分答案是logging.Formatter.converter,但是,您必须了解天真和有意识的日期时间对象。除非您想编写自己的时区模块,否则我强烈建议您使用pytz库 ( pip install pytz
)。Python 3 包括一个 UTC 和 UTC 偏移时区,但是对于夏令时或其他偏移,您必须实施一些规则,所以我建议使用 pytz 库,即使对于 python 3 也是如此。
例如,
>>> import datetime
>>> utc_now = datetime.datetime.utcnow()
>>> utc_now.isoformat()
'2019-05-21T02:30:09.422638'
>>> utc_now.tzinfo
(None)
如果我将时区应用于此日期时间对象,则时间不会改变(或将发出ValueError
for < python 3.7ish)。
>>> mst_now = utc_now.astimezone(pytz.timezone('America/Denver'))
>>> mst_now.isoformat()
'2019-05-21T02:30:09.422638-06:00'
>>> utc_now.isoformat()
'2019-05-21T02:30:09.422638'
但是,如果相反,我会
>>> import pytz
>>> utc_now = datetime.datetime.now(tz=pytz.timezone('UTC'))
>>> utc_now.tzinfo
<UTC>
datetime
现在我们可以在我们希望的任何时区创建一个正确翻译的对象
>>> mst_now = utc_now.astimezone(pytz.timezone('America/Denver'))
>>> mst_now.isoformat()
'2019-05-20T20:31:44.913939-06:00'
啊哈!现在将其应用于日志记录模块。
纪元时间戳到带有时区的字符串表示
该LogRecord.created
属性设置为从模块LogRecord
创建(由返回)的时间。这将返回一个时间戳(自纪元以来的秒数)。您可以自己翻译到给定的时区,但我再次建议,通过覆盖转换器。time.time()
time
pytz
import datetime
import logging
import pytz
class Formatter(logging.Formatter):
"""override logging.Formatter to use an aware datetime object"""
def converter(self, timestamp):
dt = datetime.datetime.fromtimestamp(timestamp)
tzinfo = pytz.timezone('America/Denver')
return tzinfo.localize(dt)
def formatTime(self, record, datefmt=None):
dt = self.converter(record.created)
if datefmt:
s = dt.strftime(datefmt)
else:
try:
s = dt.isoformat(timespec='milliseconds')
except TypeError:
s = dt.isoformat()
return s
Python 3.5、2.7
>>> logger = logging.root
>>> handler = logging.StreamHandler()
>>> handler.setFormatter(Formatter("%(asctime)s %(message)s"))
>>> logger.addHandler(handler)
>>> logger.setLevel(logging.DEBUG)
>>> logger.debug('test')
2019-05-20T22:25:10.758782-06:00 test
蟒蛇 3.7
>>> logger = logging.root
>>> handler = logging.StreamHandler()
>>> handler.setFormatter(Formatter("%(asctime)s %(message)s"))
>>> logger.addHandler(handler)
>>> logger.setLevel(logging.DEBUG)
>>> logger.debug('test')
2019-05-20T22:29:21.678-06:00 test
替换pytz 定义的 posix 时America/Denver
区America/Anchorage
>>> next(_ for _ in pytz.common_timezones if 'Alaska' in _)
'US/Alaska'
美国/阿拉斯加已弃用
>>> [_ for _ in pytz.all_timezones if 'Anchorage' in _]
['America/Anchorage']
当地的
如果您在寻找如何记录本地时区时遇到此问题和答案,则不要对时区进行硬编码,而是获取tzlocal
( pip install tzlocal
) 并替换
tzinfo = pytz.timezone('America/Denver')
和
tzinfo = tzlocal.get_localzone()
现在它将在运行脚本的任何服务器上运行,时区位于服务器上。
不记录 UTC 时的警告
我应该补充一点,根据应用程序,登录本地时区可能会产生歧义或至少每年两次造成混乱,其中 2 AM 被跳过或 1 AM 重复,可能还有其他。