在UNIX中将Julian时间戳转换为常规时间

时间:2011-11-09 00:59:32

标签: bash timestamp julian-date

我需要使用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内置函数返回一个以空格分隔的九个数字列表,包括朱利安日数,年,月,日,小时,分钟,秒,毫秒和微秒。

2 个答案:

答案 0 :(得分: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,您可以使用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中,或者更可能是我在1970年1月1日使用的值可能是一小时。因此,您可能需要检查它们以确保它适合您的系统。

答案 1 :(得分:0)

这是MJD转换器

MJD比纪元

为-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