【问题标题】:Convert Julian Timestamp to Regular Time in UNIX在 UNIX 中将 Julian 时间戳转换为常规时间
【发布时间】:2011-12-24 22:36:25
【问题描述】:

我需要在 UNIX 中使用 Bash 将 Julian 时间戳转换为常规时间戳。

在 Tandem OS 上,转换非常简单 -

示例: 212186319010244541

$OLSAPP SYSTST 1> #interprettimestamp 212186319010244541

#interprettimestamp 212186319010244541 expanded to:

2455860 2011 10 25 16 10 10 244 541

我希望在 UNIX 环境中做同样的事情。转换将成为解析器脚本的一部分。所以单行将不胜感激。

更新

Tandem 上的 INTERPRETTIMESTAMP 内置函数返回以空格分隔的九个数字列表,包括儒略日数、年、月、日、小时、分钟、秒、毫秒和微秒。

【问题讨论】:

  • 212186319010244541 的纪元时间是多少?这是真正的儒略时间吗,就像儒略历那样?
  • 来自docs:朱利安时间戳是“表示自公元前 4713 年 1 月 1 日以来的微秒数的值”
  • 如何定义“常规时间戳”?我可以猜到 2011, 10, 25, 16, 10, 10 是公元年、月、月中的一天、一天中的小时(16 点)、10 分钟、10 秒。但剩下的数字是多少,即 2455860, 244, 541 ?我在您引用的文档中没有提到输出格式。
  • 这里有几十个关于 S.O. 的问题。关于在 Unix 中转换日期。最简单的解决方案是使用 GNU date 实用程序,如果您使用的是 linux,那么您几乎可以肯定它是 /bin/date,所以man date 也会为您提供很多信息。祝你好运。

标签: bash timestamp julian-date


【解决方案1】:

假设数字如@blahdiblah 所说

“表示自公元前 4713 年 1 月 1 日以来的微秒数”

那么你首先需要知道 01-JAN-1970 的 Julian 时间戳,这是 unix 时间的纪元。所以一个笨拙的 oracle 查询给出了

210866803200000000

那么您理论上可以只使用一个 shell 命令来计算自 1970 年 1 月 1 日以来的秒数。

unixtime=$(( ( 212186319010244541 - 210866803200000000 ) / 1000000 ))

这样做的问题是:

  • 你仍然需要格式化它
  • 您的 bash 可能不喜欢 18 位数字的整数运算。 (认为​​它在 64 位中可以,但不是 32 位)。

现在,如果您安装了 perl,您可以使用 bigintPOSIX 模块解决这些问题。作为一个外壳“一个”的衬垫,它看起来像

perl -mbigint -mPOSIX -e 'print( POSIX::strftime("%Y-%m-%d %T",localtime( ($ARGV[0]-210866803200000000)/1000000 ) )."\n")' 212186319010244541

这给了

2011-10-25 15:10:10

1 小时的差异可能是由于夏令时的差异。它可能在 perl 中,或者我用于 01-Jan-1970 的值更可能是一个小时。因此,您可能需要同时检查它们以确保它适合您的系统。

【讨论】:

  • 朱利安时间戳系统的起点似乎是公元前 4713 年 1 月 1 日。在中午,而不是在一天的开始。然后上面产生了 12 小时的偏移量。在这种情况下,减去 210866760000000000 而不是上面的,以到达正确的时间。
  • @Edwin 我有类似的要求:将朱利安日期数字从 Tandem 系统转换为 unix 纪元时间;并且您的版本(减去 210866760000000000)会产生我需要的确切时间戳。谢谢!
  • 我正在尝试将 212186319010244541 转换为 Unix 纪元,但上述解决方案均无效。
  • @AkshayNaik 你可以看到它在相关步骤中被破坏。 ideone.com/eW8RHl
【解决方案2】:

这是MJD转换器

MJD 比 epoch 为 -3506716800

# date -d '1858-11-17 UTC' +%s
-3506716800

示例: MDJ 57153 是 2015 年 5 月 11 日星期一 00:00:00 UTC

# date -d @`echo 57153*86400-3506716800|bc`
Mon May 11 00:00:00 UTC 2015

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 1970-01-01
    • 2023-03-18
    • 2013-04-07
    • 2020-07-29
    • 2010-10-25
    • 2020-10-19
    相关资源
    最近更新 更多