web-dev-qa-db-ja.com

momentjsを使用して日付をエポックに変換してから日付に戻す

日付文字列をエポックに変換してから、エポックを日付文字列に戻して、正しい日付文字列を提供していることを確認しようとしています。

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

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

54
Ian Davis

ここにはいくつか間違った点があります。

  • まず、用語。 "Epoch" は、何かの出発点を指します。 「UNIXエポック」は、UTC 1970年1月1日午前0時です。任意の「日付文字列をエポック」に変換することはできません。おそらく "Unix Time" を意味していたので、これはしばしば「エポック時間」と呼ばれます。

  • .unix() はUnix Timeを秒単位で返しますが、デフォルトのmomentコンストラクターはmillisecondsのタイムスタンプを受け入れます。代わりに .valueOf() を使用してミリ秒を返す必要があります。 .unix()*1000の呼び出しも機能しますが、精度が失われることに注意してください。

  • 書式指定子を指定せずに文字列を解析しています。コードが実行されているロケールによって、1/2/2014のような値は2月1日または1月2日として解釈される可能性があるため、これは良い考えではありません。 (これは、コンソールで非推奨の警告が表示される理由でもあります。)代わりに、次のような予想される入力に一致する format string を指定します。

    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に異なる値を取得します。

また、秒単位で作業する場合(精度が低下する可能性がある場合)、モーメントにもそのためのメソッドがあります。 .unix()を使用してタイムスタンプを秒単位で返し、moment.unix(ts)を使用してタイムスタンプを一瞬まで戻します。

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

http://momentjs.com/docs/#/displaying/unix-timestamp/

ミリ秒ではなく、UNIXの秒数を取得します!

あなたはそれを1000またはvalueOf()を使用して乗算する必要があり、非ISOを使用しているため、フォーマッタを使用することを忘れないでください8601形式。フォーマッタを渡すのを忘れた場合、日付はUTCタイムゾーンまたは無効な日付として解析されます。

moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").valueOf()
8
timaschew