众所周知,“unix” 中的文件除了“/”和“\0”之外可以包含任何内容,但系统管理员对此的偏好却小得多,主要是因为他们不喜欢空格作为输入……而且还有很多东西对“:”和“@”等有特殊含义。
最近我又看到了另一种在文件名中使用时间戳的情况,在尝试了一些不同的格式以使其“更好”之后,我想我会尝试找到一种“最佳实践”,但没有看到,我想我会在这里问一下,看看大家的想法。
可能的“常见”解决方案(p=前缀和 s=后缀):
syslog/logrotate/DNS 类似格式:
p-%Y%m%d-suffix = prefix-20110719-s p-%Y%m%d%H%M-suffix = prefix-201107191732-s p-%Y%m%d%H%M%S-suffix = prefix-20110719173216-s
优点:
- 它很“常见”,所以“足够好”可能比“最好”更好。
- 没有奇怪的人物。
- 很容易将“日期/时间斑点”与其他所有内容区分开来。
缺点:
- 仅显示日期的版本不易阅读,包括时间也让我的眼睛流血,而且秒数也只是“哈哈”。
- 假设 TZ。
ISO-8601 格式
p-%Y-%m-%d-s = p-2011-07-19-s p-%Y-%m-%dT%H:%M%z-s = p-2011-07-19T17:32-0400-s p-%Y-%m-%dT%H:%M:%S%z-s = p-2011-07-19T17:32:16-0400-s p-%Y-%m-%dT%H:%M:%S%z-s = p-2011-07-19T23:32:16+0200-s
优点:
- 没有空间。
- 考虑了 TZ。
- 对于人类来说读起来“还不错”(只有日期非常好)。
- 可以通过$(date --iso={hours,minutes,seconds})生成
缺点:
- scp/tar/etc. 不喜欢那些‘:’字符。
- “正常”人需要花一点时间才能明白“T”是什么意思,以及它最后面的东西是什么:)。
- 很多‘-’字符。
rfc-3339 格式
p-%Y-%m-%d-s = p-2011-07-19-s p-%Y-%m-%d %H:%M%:z-s = p-2011-07-19 17:32-04:00-s p-%Y-%m-%d %H:%M:%S%:z-s = p-2011-07-19 17:32:16-04:00-s p-%Y-%m-%d %H:%M:%S%:z-s = p-2011-07-19 23:32:16+02:00-s
优点:
- 考虑了 TZ。
- 可以被“所有人类”轻松阅读。
- 可以区分日期/时间与前缀/后缀。
- 以上部分内容可使用 $(date --iso={hours,seconds}) 生成
缺点:
- 时间版本中有空格(这意味着所有代码都会讨厌它)。
- scp/tar/etc. 不喜欢那些‘:’字符。
我喜欢连字符:
p-%Y-%m-%d-s = p-2011-07-19-s p-%Y-%m-%d-%H-%M-s = p-2011-07-19-17-32-s p-%Y-%m-%d-%H-%M-%S-s = p-2011-07-19-23-32-16-s
优点:
- 基本上是一个稍微好一点的 syslog/etc. 变体。
缺点:
- 很多‘-’字符。
- 假设 TZ。
我喜欢连字符,以及扩展名:
p.%Y-%m-%d.s = p.2011-07-19.s p.%Y-%m-%d.%H-%M.s = p.2011-07-19.17-32.s p.%Y-%m-%d.%H-%M-%S.s = p.2011-07-19.23-32-16.s
优点:
- 基本上是一个稍微好一点的“我喜欢连字符”变体。
- 没有奇怪的人物。
- 可以区分日期/时间与前缀/后缀。
缺点:
- 在这里使用‘.’有点不传统。
- 假设 TZ。
...所以任何人都想给出一个偏好和一个理由,或者多个(例如,如果保持机器本地化率为 95+%,就不要关心 TZ,但如果不是,就要非常关心)。
或者,显然是上面列表中没有的内容。
答案1
- 应尽可能遵守 ISO 8601 格式,因为它是最接近标准的格式。
- “T” 并不足以成为真正需要摆脱它的绊脚石。
- “:” 是潜在的杀手,因此应该避免使用。
- 由于其他人的答案中提到的原因,应该使用 UTC(或“Z”时间)。
- ISO 8601 包含一种使用 UTC(“Z”时间)的格式,应该使用该格式。
- ISO 8601 包含一种不使用“:”字符的格式,但应该使用该字符。
那么...示例“最佳”日期时间格式:
20120317T1748Z
- 100% 符合 ISO 8601 标准
- 仅限字母数字字符(非常适合系统管理员)
- 阅读速度不是最快的,但对于普通人来说肯定是可以读懂的
2012-03-17T1748Z
- 日期部分符合 ISO 8601
- 时间部分符合 ISO 8601
- 日期和时间之间的转换符合 ISO 8601
- 将 ISO 8601“扩展”格式(日期带有连字符,时间带有冒号)与 ISO 8601“基本”格式(日期不带连字符,时间不带冒号)混合在一起,这可能不太正确
- 添加‘-’字符(与 1 相比)
- 对于普通人来说更容易阅读(与 1 相比)
2012-03-17--1748Z
- 日期部分符合 ISO 8601
- 时间部分符合 ISO 8601
- 日期和时间之间的转换不符合 ISO 8601
- 将 ISO 8601“扩展”格式与 ISO 8601“基本”格式混合
- 对于普通人来说更容易阅读(与 1. 和 2. 相比)
- 没有新角色(与 2 相比)
我偏爱 1.,因为它完全符合 IAW 标准,但其他的也很接近。
注意:当然,根据需要添加秒数。...是的,有或没有秒(甚至分钟)都是符合 ISO 8601 的。:)
答案2
我不会包含时区,只使用世界时间。如果可能会造成混淆,您可以添加 -UTC 后缀。如果您指定时区,有人可能会依赖它。并且会出现奇怪的边缘情况,例如 DST 更改或 DST 转换会对某些处理造成严重破坏,或者某些系统的处理会有所不同,因为它们的 DST 配置不是最新的。UTC 在任何地方都是一样的。
我确实认为连字符使文件名更具可读性,因为它使文件数据的日期时间更容易辨别。如果您想包含亚秒级精度,通常是 .nnnnn。
我个人不喜欢 T。在文件名中使用冒号可能会影响与其他文件系统的互操作性。
答案3
无论如何,这是屏幕截图实用程序的格式
scrot
默认使用文件名(即:当未指定文件名时):
%Y-%m-%d-%H%M%S_$wx$h_scrot.png
所用部件%
均为标准strftime(3)
格式说明符,$w
是图像宽度,$h
是图像高度。
例子:
$ scrot
$ find *.png
2020-03-07-152236_1920x1080_scrot.png
对于 UTC 时间戳:
$ TZ=UTC scrot
$ find *.png
2020-03-07-152236_1920x1080_scrot.png
2020-03-07-183257_1920x1080_scrot.png
笔记:文件名中未指定时区。考虑到该工具的预期用途(即屏幕截图),我认为它不会增加任何价值。此外,我发现上面的格式很容易阅读和解析。
来源:
if (!opt.output_file) {
opt.output_file = gib_estrdup("%Y-%m-%d-%H%M%S_$wx$h_scrot.png");
opt.thumb_file = gib_estrdup("%Y-%m-%d-%H%M%S_$wx$h_scrot-thumb.png");
} else {
have_extension = scrot_have_file_extension(opt.output_file);
}
答案4
我用$ date -u +%Y-%m-%d-%H-%M-%S
这是一个 UTC 时间戳,对我的系统的最佳猜测,可轻松编码为:
- URL(存储桶、静态托管)
- 文件系统(Windows、macOS、Linux)
- 贝壳
- 其他应用程序和 GUI 程序
2022-12-12-19-19-10.log
2021-11-06-15-59-00.log
- 文件看上去足够可读。
- 这是一个简单的字符集
{0,1,2,3,4,5,6,7,8,9,-}
- 不区分日期和时间它们都是作为日期时间戳
- 缺点,需要在运行时或在数据库中转换为 iso