在UNIX中将朱利安时间戳转换为常规时间



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

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

的例子:212186319010244541

$OLSAPP SYSTST 1> #interprettimestamp 212186319010244541
#interprettimestamp 212186319010244541 expanded to:
2455860 2011 10 25 16 10 10 244 541

我希望在UNIX环境中做同样的事情。转换将是解析器脚本的一部分。所以一句俏皮话会非常受欢迎。

:

INTERPRETTIMESTAMP在Tandem上的内置函数返回一个由9个数字组成的空格分隔的列表,这些数字包括儒略日、年、月、日、时、分、秒、毫秒和微秒。

假设数字如@blahdiblah所说

"表示从公元前4713年1月1日开始的微秒数的值"

那么您首先需要知道01-JAN-1970的朱利安时间戳,这是unix时间的epoch。因此,一个模糊的oracle查询给出

210866803200000000

那么理论上你可以用shell命令来计算从1970年1月1日到现在的秒数。

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

问题是:

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

现在如果你安装了perl,你可以使用bigintPOSIX模块解决这些问题。作为shell"one"行符,它看起来像

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日使用的值可能是一个小时后的值。因此,您可能需要检查这两个选项,以确保它适合您的系统。

这是MJD转换器

MJD是-3506716800比epoch

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

的例子:MDJ 57153是星期一5月11日00:00:00 UTC 2015

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

最新更新