我需要在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,你可以使用bigint
和POSIX
模块解决这些问题。作为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