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())
これを使用して、モーメントオブジェクトを日付オブジェクトに変換します。
http://momentjs.com/docs/#/displaying/as-javascript-date/ から
moment().toDate();
収量:
Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
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がそれについてできることは何もありません。
他にもいくつかあります。
モーメントコンストラクタcanはDate
を取りますが、通常は使わないのが一番です。 「今」では、moment(new Date())
を使用しないでください。代わりにmoment()
を使ってください。どちらも動作しますが、不必要に冗長です。文字列から解析している場合は、その文字列を直接モーメントに渡します。最初にそれをDate
に解析しようとしないでください。あなたは、momentのパーサがはるかに信頼できるものであることに気付くでしょう。
MST7MDT
のようなタイムゾーンは、後方互換性のためにあります。それらはPOSIXスタイルのタイムゾーンから派生したもので、TZDBデータに含まれているものはごくわずかです。どうしても必要な場合を除いて、America/Denver
のようなキーを使うべきです。
.toDate
は実際には私にはうまくいきませんでした。
futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))
お役に立てれば
日付文字列にタイムゾーン情報を含める必要がありました。私はもともとmoment.tz(dateStr, 'America/New_York').toString();
を使っていましたが、それからその文字列をフィードバックすることに関してエラーを起こし始めました。
私はmoment.tz(dateStr, 'America/New_York').toDate();
を試しましたが、それから私は必要なタイムゾーン情報を失いました。
使用可能な日付文字列 timezone を返す唯一の解決策は、moment.tz(dateStr, 'America/New_York').format();
です。
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の日付オブジェクトを与えるでしょう
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を使用する必要があります。
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();
素敵できれい!
試してみる(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>