9

Matlab にエポック ミリ秒 (数値の配列) の配列があります。これらを DD-MM-YYYY HH:MM などの UTC 日時形式に変換したいと思います。

これを行うための定義済みの Matlab の方法はありますか、それとも独自の関数を作成する必要がありますか?

4

3 に答える 3

22

vector から始めて、次のようにするとしますtime_unix

>> time_unix = 1339116554872; % example time
>> time_reference = datenum('1970', 'yyyy'); 
>> time_matlab = time_reference + time_unix / 8.64e7;
>> time_matlab_string = datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF')

    time_matlab_string =

    20120608 00:49:14.872

ノート:

1) matlab の時間の定義を参照してください。

2) 8.64e7 は 1 日のミリ秒数です。

3) Matlab はタイムゾーンのシフトを適用しないため、結果は同じ UTC 時間になります。

4) 逆変換の例:

>> matlab_time = now;
>> unix_time = round(8.64e7 * (matlab_time - datenum('1970', 'yyyy')))

unix_time =

             1339118367664

要約すると、次の 2 つの機能があります。

function tm = unix2matlab(tu)
    tm = datenum('1970', 'yyyy') + tu / 864e5;
end
function tu = matlab2unix(tm)
    tu = round(864e5 * (tm - datenum('1970', 'yyyy')));
end

ここでの matlab 時間は数値です。datestr() を使用して、いつでも文字列に変換できます

ナノ秒の更新

time_unix_nanos = 1339116554872666666;
millis = round(time_unix_nanos / 1e6);
nanos = time_unix_nanos - 1e6 * millis;
time_matlab = unix2matlab(millis);
s = [datestr(time_matlab, 'yyyymmdd HH:MM:SS.FFF'), num2str(nanos)];

        s =
        20120608 00:49:14.872666666
于 2012-09-30T17:28:38.580 に答える
1

上記のコードを試しましたが、結果は間違っていました。主なエラーは、Unix 時間 (エポック時間) の厄介な定義に関連していることに気付きました。Unix 時間 (エポック時間)は、**ミリ**秒 ( http://en.wikipedia.org/wiki/Unix_time )ではなく、1970 年 1 月 1 日 00 時 00 分からの数として定義されます。したがって、この定義では、Unix 時間は 8.64e7 ではなく 8.64e5 で割る必要があります。

さらに、datenum('1970', 'yyyy')1970 年 1 月 1 日 00 時 00 分という希望の基準時刻が得られないようです。

これが私の改善されたコードです:

tMatlab = datenum (1970,1,1,0,0) + tUnix / 86400;
于 2014-05-28T12:31:11.190 に答える
0

Sergの答えは、MATLABで作業しているときに私が通常使用するものです。今日、タイトルが示すように、MATLABで日付への変換を行いたいと思いました-質問の本文で日付文字列の変換を指定せずに-シェルから日付番号を出力します。

丸められた日付番号について私が決めたのは次のとおりです。

TODAY_MATLAB="$[719529 + $[`date +%s` / 24/60/60]]"

これは実際には、予想されるものと同等の bash です。719529 はエポックの datenum (1970-01-01 またはdatenum(1970,1,1)MATLAB) です。私も最近kshをいじっていますが、これはそこで実行できるようです:

TODAY_EPOCH=`date +%s`
TODAY_MATLAB=`expr $TODAY_EPOCH / 24 / 60 / 60 + 719529`

副次的な演習として、bashの日付に小数部分を追加し直しました。ksh では気にしませんでしたが、これは算術演算のみであり、同様に進みます。

N_DIGITS=7
FORMAT=$(printf "%%d.%%0%dd" $N_DIGITS)

NOW_EP_SEC=`date +%s` 
SEC_PER_DAY=$(( 24*60*60 )) 
NOW_EP_DAY=$(( $NOW_EP /$SEC_PER_DAY ))  
SEC_TODAY=$(( $NOW_EP_SEC - $NOW_EP_DAY*$SEC_PER_DAY )) 

TODAY_MATLAB="$(( NOW_EP_DAY+719529 ))"
FRACTION_MATLAB="$( printf '%07d' $(( ($SEC_TODAY*10**$N_DIGITS)/SEC_PER_DAY )) )"
MATLAB_DATENUM=$( printf $FORMAT $TODAY_MATLAB $FRACTION_MATLAB )

echo $MATLAB_DATENUM
于 2014-09-25T16:45:51.160 に答える