包含时间戳的文件名的首选格式

包含时间戳的文件名的首选格式

众所周知,“unix” 中的文件除了“/”和“\0”之外可以包含任何内容,但系统管理员对此的偏好却小得多,主要是因为他们不喜欢空格作为输入……而且还有很多东西对“:”和“@”等有特殊含义。

最近我又看到了另一种在文件名中使用时间戳的情况,在尝试了一些不同的格式以使其“更好”之后,我想我会尝试找到一种“最佳实践”,但没有看到,我想我会在这里问一下,看看大家的想法。

可能的“常见”解决方案(p=前缀和 s=后缀):

  1. 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。
  2. 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”是什么意思,以及它最后面的东西是什么:)。
    • 很多‘-’字符。
  3. 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. 不喜欢那些‘:’字符。
  4. 我喜欢连字符:

    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。
  5. 我喜欢连字符,以及扩展名:

    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

  1. 应尽可能遵守 ISO 8601 格式,因为它是最接近标准的格式。
  2. “T” 并不足以成为真正需要摆脱它的绊脚石。
  3. “:” 是潜在的杀手,因此应该避免使用。
  4. 由于其他人的答案中提到的原因,应该使用 UTC(或“Z”时间)。
  5. ISO 8601 包含一种使用 UTC(“Z”时间)的格式,应该使用该格式。
  6. ISO 8601 包含一种不使用“:”字符的格式,但应该使用该字符。

那么...示例“最佳”日期时间格式:

  1. 20120317T1748Z

    • 100% 符合 ISO 8601 标准
    • 仅限字母数字字符(非常适合系统管理员)
    • 阅读速度不是最快的,但对于普通人来说肯定是可以读懂的
  2. 2012-03-17T1748Z

    • 日期部分符合 ISO 8601
    • 时间部分符合 ISO 8601
    • 日期和时间之间的转换符合 ISO 8601
    • 将 ISO 8601“扩展”格式(日期带有连字符,时间带有冒号)与 ISO 8601“基本”格式(日期不带连字符,时间不带冒号)混合在一起,这可能不太正确
    • 添加‘-’字符(与 1 相比)
    • 对于普通人来说更容易阅读(与 1 相比)
  3. 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

相关内容