web-dev-qa-db-ja.com

Moment.jsを日付オブジェクトに変換

Moment.jsを使用すると、正しいモーメントオブジェクトをタイムゾーンのある日付オブジェクトに変換できません。正しい日付がわかりません。

例:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())
500
vadim.zhiltsov

これを使用して、モーメントオブジェクトを日付オブジェクトに変換します。

http://momentjs.com/docs/#/displaying/as-javascript-date/ から

moment().toDate();

収量:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
932
Chandrew

moment-timezone / 必要なゾーンのデータを初期化している限り あなたのコードは期待通りに動作します。

あなたはモーメントをタイムゾーンに正しく変換しています。それはmomentObj.format()の出力の2行目に反映されています。

UTCに切り替えてもオフセットがドロップされるだけではなく、UTCタイムゾーンに戻ります。あなたがそうするつもりならば、あなたはオリジナルの.tz()呼び出しを全く必要としません。あなたはただmoment.utc()をすることができます。

たぶん、あなたはただ出力フォーマット文字列を変えようとしていますか?そうであれば、formatメソッドに必要なパラメータを指定するだけです。

momentObj.format("YYYY-MM-DD HH:mm:ss")

最後のコード行について - toDate()を使用してDateオブジェクトに戻ると、moment.jsの動作をあきらめてJavaScriptの動作に戻ります。 JavaScriptのDateオブジェクトは常に実行されているコンピュータのローカルタイムゾーンで表示されます。 moment.jsがそれについてできることは何もありません。

他にもいくつかあります。

  • モーメントコンストラクタcanDateを取りますが、通常は使わないのが一番です。 「今」では、moment(new Date())を使用しないでください。代わりにmoment()を使ってください。どちらも動作しますが、不必要に冗長です。文字列から解析している場合は、その文字列を直接モーメントに渡します。最初にそれをDateに解析しようとしないでください。あなたは、momentのパーサがはるかに信頼できるものであることに気付くでしょう。

  • MST7MDTのようなタイムゾーンは、後方互換性のためにあります。それらはPOSIXスタイルのタイムゾーンから派生したもので、TZDBデータに含まれているものはごくわずかです。どうしても必要な場合を除いて、America/Denverのようなキーを使うべきです。

41
Matt Johnson

.toDateは実際には私にはうまくいきませんでした。

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

お役に立てれば

18
Mawaheb

日付文字列にタイムゾーン情報を含める必要がありました。私はもともとmoment.tz(dateStr, 'America/New_York').toString();を使っていましたが、それからその文字列をフィードバックすることに関してエラーを起こし始めました。

私はmoment.tz(dateStr, 'America/New_York').toDate();を試しましたが、それから私は必要なタイムゾーン情報を失いました。

使用可能な日付文字列 timezone を返す唯一の解決策は、moment.tz(dateStr, 'America/New_York').format();です。

4
chovy

MomentjsはJavaScriptの日付オブジェクトを制御できないので、これに対する回避策を見つけました。 

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

これはあなたに変換された時間であなたにJavaScriptの日付オブジェクトを与えるでしょう 

3

momentは、2016/06の時点でjs libを更新しました。 

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

angular 5 +を使用する自由がある場合は、ここのタイムゾーン関数よりもdatePipe機能を使用したほうがよいでしょう。私のプロジェクトはAngular 2のみに限定されているので、moment.jsを使用する必要があります。

2
Feng Zhang
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

素敵できれい! 

0
Emerson Bottero

試してみる(formatステップなしで)

new Date(moment())
var d = moment.tz("2019-04-15 12:00", "America/New_York");

console.log( new Date(d) );
console.log( new Date(moment()) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.min.js"></script>
0