我需要使用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内置函数返回一个以空格分隔的九个数字列表,包括朱利安日数,年,月,日,小时,分钟,秒,毫秒和微秒。
答案 0 :(得分:4)
假设这个数字是@blahdiblah所说的
“表示自公元前4713年1月1日以来的微秒数的值。”
然后你首先需要知道01-JAN-1970的Julian时间戳,这是unix时间的纪元。所以一个cludgy oracle查询给出了
210866803200000000
然后你可以在理论上只有一个shell命令来计算自1970年1月1日以来的秒数。
unixtime=$(( ( 212186319010244541 - 210866803200000000 ) / 1000000 ))
问题是:
现在,如果安装了perl,您可以使用bigint
和POSIX
模块解决这些问题。作为一个外壳“一”衬里看起来像
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