日付文字列をエポックに変換してから、エポックを日付文字列に戻して、正しい日付文字列を提供していることを確認しようとしています。
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を使用しています
ここにはいくつか間違った点があります。
まず、用語。 "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);
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()