0

我想将纪元时间转换为人类可读的格式。我在网上搜索,发现一个

示例:date -d @1270787111

我重读了日期手册。

-d, --date=STRING 由 STRING 描述的显示时间,而不是“现在”

DATE STRING --date=STRING 大部分是免费的...

我对这种格式一无所知。我错过了什么吗?

4

3 回答 3

2

您所指的同一“日期字符串”部分以以下句子结尾:

日期字符串格式比这里容易记录的要复杂,但在 info 文档中有完整的描述。

换句话说,您必须参考“信息”页面。您可以通过info date在终端中输入来执行此操作,或者在线查看这些文档。例如,输入格式在这里得到了很好的描述。

那么为什么@需要前缀date -d @1270787111呢?@手册页示例中提到的特定格式在 §28.8中进行了描述:

自纪元以来的 28.8 秒

如果您在数字前面加上@', it represents an internal time stamp as a count of seconds. The number can contain an internal decimal point (either.' 或“,”);内部表示不支持的任何超额精度都会被截断为负无穷大。这样的数字不能与任何其他日期项目组合,因为它指定了一个完整的时间戳。

在内部,计算机时间表示为自一个纪元以来的秒数 - 一个明确定义的时间点。在 GNU 和 POSIX 系统上,纪元是 1970-01-01 00:00:00 UTC,所以@0' represents this time,@1' 代表 1970-01-01 00:00:01 UTC,依此类推。GNU 和大多数其他 POSIX 兼容系统支持使用负计数作为 POSIX 扩展的时间,因此 `@-1' 表示 1969-12-31 23:59:59 UTC。

传统的 Unix 系统使用 32 位二进制补码整数计算秒数,可以表示从 1901-12-13 20:45:52 到 2038-01-19 03:14:07 UTC 的时间。更现代的系统使用 64 位秒计数和纳秒子计数,并且可以以 1 纳秒的分辨率表示已知宇宙生命周期中的所有时间。

在大多数主机上,这些计数忽略了闰秒的存在。例如,在大多数主机上,@915148799' represents 1998-12-31 23:59:59 UTC,@915148800' 表示 1999-01-01 00:00:00 UTC,并且无法表示中间的闰秒 1998-12-31 23:59:60 UTC。

于 2013-06-07T14:34:30.053 回答
0

日期可以通过自 1970 年以来的整数秒数输入,前缀为“@”。

coreutils 5.3.0 版本开始。

所以这

date -d @1270787111

表示描述自纪元 (1970/01/01) 以来 1270787111 秒后的数据。

于 2013-06-07T14:27:44.933 回答
0

DATE STRING --date=STRING 是大多数自由格式的人类可读日期字符串,例如“Sun, 29 Feb 2004 16:21:42 -0800”或“2004-02-29 16:21:42”甚至“next周四”。日期字符串可能包含指示日历日期、时间、时区、星期几、相对时间、相对日期和数字的项目。空字符串表示一天的开始。日期字符串格式比这里容易记录的要复杂,但在 info 文档中有完整的描述。

从手册页底部

info coreutils 'date invocation'

应该给你你需要的信息

日期输入格式

  • 通用日期语法:: 通用规则
  • 日历日期项目::1994 年 12 月 19 日
  • 时间项目:: 9:20 PM
  • 时区项目:: EST, PDT, GMT
  • 星期几项目:: 星期一和其他
  • 日期字符串中的相关项:: 下周二,2 年前
  • 日期字符串中的纯数字:: 19931219, 1440
  • 纪元以来的秒数:: @1078100502
  • 指定时区规则:: TZ="America/New_York", TZ="UTC0"
  • parse_datetime:: Bellovin、Eggert、Salz、Berets 等的作者
于 2013-06-07T14:30:56.703 回答