1. ホーム
  2. javascript

[解決済み] momentjs を使って日付をエポックに変換し、日付に戻す。

2023-05-02 01:32:57

質問

日付文字列をエポックに変換し、その後、正しい日付文字列を提供しているかどうかを確認するために、日付文字列にエポックを戻そうとしています。

var epoch = moment("10/15/2014 9:00").unix(); // do I need to do .local()?
var momentDate = moment(epoch); // I've also tried moment.utc(epoch) 
var momentDateStr = momentDate.calendar();
alert("Values are: epoch = " + epoch + ", momentDateStr = " + momentDateStr);

レンダリング

Values are: epoch = 1413378000, momentDateStr = 01/17/1970

注:モーメントjsスクリプトの以下のバージョンを使用しています、/cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/modent-with-locales.js。

どのように解決するのですか?

いくつか問題があるようです。

  • まず、用語について。 "エポック"。 とは、何かの開始点を意味します。 Unix Epoch" は UTC 1970年1月1日午前0時です。 任意の日付文字列をエポックに変換することはできません。 おそらく "Unixタイム" のことでしょう。これはしばしば間違って "Epoch Time" と呼ばれます。

  • .unix() はUnix Timeを秒単位で返しますが、デフォルトの moment のコンストラクタはタイムスタンプを ミリ秒 . 代わりに .valueOf() を使ってミリ秒を返します。 ただし .unix()*1000 を呼び出しても動作しますが、精度が落ちてしまうことに注意してください。

  • フォーマット指定子を指定せずに文字列を解析しています。 コードが実行されている場所のロケールによって、1/2/2014 のような値が February 1st または January 2nd として解釈される可能性があるため、これは良いアイデアではありません。 (これはコンソールに非推奨の警告が表示される理由でもあります。) そのかわりに 形式の文字列 のような、期待される入力にマッチするフォーマット文字列を指定します。

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
    
  • .calendar() は非常に特殊な使い方をします。 もし日付が近ければ、"Today 9:00 AM"のような値が返されるでしょう。 もしそれが期待したものでないなら、あなたは .format() 関数を使うべきです。 ここでも、フォーマット指定子を渡したいかもしれません。

  • コメントでの質問に答えると、いいえ - あなたは .local() または .utc() .

すべてをまとめる。

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").valueOf();
var m = moment(ts);
var s = m.format("M/D/YYYY H:mm");
alert("Values are: ts = " + ts + ", s = " + s);

私のマシンでは、米国太平洋時間帯では、結果はこうなります。

値は、ts = 1413388800000, s = 10/15/2014 9:00 です。

入力された値はローカルタイムで解釈されますので ts には異なる値が返されます。

また、本当に秒単位で処理したい場合(精度が落ちる可能性があります)、momentにはそのためのメソッドも用意されていることに注意してください。 例えば .unix() を使ってタイムスタンプを秒単位で返します。 moment.unix(ts) で解析し、瞬間に戻します。

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").unix();
var m = moment.unix(ts);