4

Bashを使用してUNIXでJulianタイムスタンプを通常のタイムスタンプに変換する必要があります。

タンデムOSでは、変換は非常に簡単です-

例:212186319010244541

$OLSAPP SYSTST 1> #interprettimestamp 212186319010244541

#interprettimestamp 212186319010244541 expanded to:

2455860 2011 10 25 16 10 10 244 541

UNIX環境でも同じことをしたいと思います。変換はパーサースクリプトの一部になります。したがって、ワンライナーをいただければ幸いです。

更新

タンデムのINTERPRETTIMESTAMP組み込み関数は、ユリウス日番号、年、月、日、時、分、秒、ミリ秒、およびマイクロ秒で構成される9つの数値のスペース区切りのリストを返します。

4

2 に答える 2

4

数が@blahdiblahの言うとおりであると仮定します

「紀元前4713年1月1日からのマイクロ秒数を表す値」

次に、最初に UNIX 時間のエポックである 01-JAN-1970 のユリウス タイムスタンプを知る必要があります。したがって、ぎこちないOracleクエリは次のようになります

210866803200000000

そうすれば、理論的には、1970 年 1 月 1 日からの秒数を計算するシェル コマンドを使用できます。

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

これに関する問題は次のとおりです。

  • あなたはまだそれをフォーマットする必要があります
  • あなたの bash は 18 桁の整数演算を好まないかもしれません。(64ビットでは問題ないと思いますが、32ビットでは問題ありません)。

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 時間ずれている可能性があります。したがって、両方をチェックして、システムに適していることを確認する必要がある場合があります。

于 2011-11-09T04:01:26.450 に答える
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
于 2015-05-13T02:45:03.917 に答える