4

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

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

示例:212186319010244541

$OLSAPP SYSTST 1> #interprettimestamp 212186319010244541

#interprettimestamp 212186319010244541 expanded to:

2455860 2011 10 25 16 10 10 244 541

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

更新

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

4

2 回答 2

4

假设数字如@blahdiblah 所说

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

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

210866803200000000

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

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

这样做的问题是:

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

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

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 的值更可能是一个小时。因此,您可能需要同时检查它们以确保它适合您的系统。

于 2011-11-09T04:01:26.450 回答
0

这是 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
于 2015-05-13T02:45:03.917 回答