时间戳格式
目录:
摘要
问题
我们希望通过使用时间戳,并使用在我们所有系统和第三方系统中都能良好运作的统一时间戳格式,来追踪事情发生的时间。
我们要与具有不同时间戳格式的系统交互:
JSON 消息没有原生的时间戳格式,因此我们需要选择如何将时间戳转换为字符串,以及如何将字符串转换为时间戳,即如何序列化/反序列化。
有些应用被设置为使用本地时间,而不是 UTC 时间。这对于必须适应本地时间的项目来说可能很方便,例如触发基于本地时间的事件的项目。
有些系统对时间精度有不同的需求和能力,例如使用秒、毫秒或纳秒的时间分辨率。例如,Linux 操作系统的
date命令默认使用秒级时间精度,而纳斯达克证券交易所则要求默认使用纳秒级时间精度。
决策
我们选择具有纳秒精度的 ISO 8601 标准时间戳格式,具体为“YYYY-MM-DDTHH:MM:SS.NNNNNNNNNZ”。
该格式显示年、月、日、时、分、秒、纳秒以及 Zulu 时区(又称 UTC、GMT)。
状态
已决定。
详情
假设
我们需要处理这些时间戳文本字符串,即把时间戳转换为字符串(又称序列化),并把字符串转换为时间戳(又称反序列化)。
我们希望格式总体上易于使用、易于转换,并且便于人阅读。
我们希望与大量无法控制的外部系统兼容,例如分析系统、数据库系统和金融系统。
约束
有些系统存在时间精度限制。例如,macOS 操作系统的 date 命令可以以秒为单位打印时间精度,但不能以纳秒为单位。
立场
我们考虑了一系列选项:
Unix 纪元(epoch),即一个不断递增的数字。
简洁的文本格式“YYYYMMDDTHHMMSSNNNNNNNNN”。
使用本地时区还是 UTC 时区。
论证
对于典型的使用,我们更看重便于人阅读/书写,而不是原始速度/体积。
对于典型的使用,我们希望格式在机器系统中运行良好,同时也便于手动操作,例如编写示例数据、阅读 JSON 输出、用 grep 搜索日志文件等。
对于非典型的使用,例如高性能计算,我们预计会希望通过将文本转换为更快的格式(例如编程语言内置的日期对象类型)来优化我们所选择的任何文本格式。因此,文本格式对高性能计算(HPC)来说并不太重要。
影响
我们各种文本系统和时间系统将趋于采用这一格式。
相关内容
相关决策
我们可能还希望有一种快速/简便的方式来追踪时间差,即持续时间。使用 Unix 纪元时间戳很容易做到这一点。
相关需求
如果我们有对特定类型日志消息戳的相关需求(例如用于 Splunk、Sumo、ELK 等),我们可能需要调整我们的决策。
相关制品
语言的格式化和解析工具:
Rosetta Code 示例:
SixArm 示例:
相关原则
易于撤销。我们可以很容易地改用其他格式,例如 Unix 纪元。
推迟过早优化。对于典型的使用,我们并不太在意多出几个字符,例如使用短横线和冒号的格式。
备注
在此添加备注。