Moment.jsは日付オブジェクトに変換します


696

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())

1
どのような出力が期待され、どのような出力が得られますか?
Felix Kling 2013

4
4行で出力する:<code>(日付オブジェクト)オフセット付き時刻2013年8月1日Thu Aug 01 15:23:49 GMT + 0300(Финляндия(лето))</ code>ただし、タイムゾーンはMST7MDT
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amこれを変換することは可能2019-04-23T19:17:48.000Z ですか?@ vadim.zhiltsov
Anupam Maurya

日付オブジェクトにはタイムゾーンがありません。1970-01-01T00:00:00Zからのオフセットです。したがって、toDateを呼び出すと、返されたオブジェクトは、でモーメントオブジェクトにアタッチしたタイムゾーン情報を失っています.tz("MST7MDT")。そのため、moment.tzのようなライブラリが存在し、UTCとホストのタイムゾーンのみを理解する組み込みのDateオブジェクトの必要最小限の機能を補足します。
RobG

回答:


1235

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

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

moment().toDate();

収量:

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

11
@スペンサー-はい、それはタイトルに答えます、そしてtoDate確かにDateからオブジェクトを取得する方法momentです。しかし、質問の本文のコードは、タイムゾーン変換について尋ねます-これDateはできません。山岳部の時刻が実際にユーザーのタイムゾーンでない限り、これがどのように質問に答えたかはわかりません。
Matt Johnson-Pint 2015

1
@マットそれはあなたが見ている質問のどの部分に依存します。大多数の人々はグーグルを検索し、このタイトルが質問と一致し、質問の本文ではなく、タイトルに答える回答に賛成することを確認します。これは、技術的にOPを支援しないにもかかわらず、これが最も賛成票を獲得する理由を説明している可能性があります。
スペンサー

14
これは実際に正しい答えですか?問題は、モーメントオブジェクトをJavaScriptの日付に変換する方法ですが、TIMEZONEを使用します。JavaScriptの日付オブジェクトに変更すると、ローカルタイムゾーンに戻ります。
2016

1
こんにちはみんなこのリンクmomentjs.com/guides/#/warnings/js-dateをチェックしてください。これはお勧めできません。今後のメジャーリリースで削除される予定です。
gtzinos

3
@gtzinosは、リンクして参照しているのは別の問題とシナリオです。たとえば、コンストラクターに文字列を渡すと、moment("12/12/2011")メッセージが表示されます。それは瞬間から日付まで行くこととは何の関係もありませんobjmoment().toDate()
btbJosh

51

必要なゾーンのデータでmoment-timezoneを初期化している限り、コードは期待どおりに機能します。

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

UTCに切り替えると、オフセットが削除されるだけでなく、UTCタイムゾーンに戻ります。それを行う場合は、元の.tz()呼び出しはまったく必要ありません。あなたはただすることができますmoment.utc()

おそらく、出力フォーマット文字列を変更しようとしているだけでしょうか?その場合は、formatメソッドに必要なパラメータを指定するだけです。

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

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

他のいくつかの小さなこと:

  • コンストラクターがを取得できる瞬間はありますがDate、通常は使用しないことをお勧めします。「今」の場合は使用しないでくださいmoment(new Date())。代わりに、を使用してくださいmoment()。どちらも機能しますが、不必要に冗長です。文字列から解析する場合は、その文字列をモーメントに直接渡します。Date最初にそれを解析しようとしないでください。瞬間のパーサーの信頼性がはるかに高くなります。

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


マットありがとう!あなたの答えは役に立ちました。MST7MDTの代わりにAmerica / Denverを使用することについて述べたように、これらのマッピングに使用できるマップはありますか?私は、CET、EET、EST5EDT、CST6CDT、PST8PDTなどのタイムゾーンをかなり使用しています。
monish001 2014

たとえば、「10:20 AM」(moment()。format( 'hh:mm A')から取得した文字列時間)をDateオブジェクトに変換することはできますか?
ram

2
@ram-1)時間があれば、を使用します.toDate()。2)コメントを使って新しい質問をしないでください。これが大きな「質問する」ボタンの目的です。
Matt Johnson-Pint 2014年

22

.toDate 本当に私にはうまくいかなかったので、ここに私がやったことがあります:

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

お役に立てれば


2
この答えは質問には答えません。コードは長い時間をかけて書く方法ですmoment().add(1, 'd').toDate()
RobG

12

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日付オブジェクトが得られます


2
これが質問に直接答える唯一の正解です。
アニッシュサナ

1
これがまさに私が欲しかったものです。私はネイティブの日付がタイムゾーンを正しく表すと期待していましたが、悲しいことに間違っていました。
mklbtz 2018

1
「YYYY-MM-DD HH:mm:ss」の形式はSafariではサポートされていないため、結果はnullになります。形式は「YYYY-MM-DDTHH:mm:ss」である必要があります(ECMAScriptでサポートされている形式、日付と時刻の部分の間に「T」を使用)。
RobG

4

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

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

瞬時にフィードバックできるタイムゾーン付きの使用可能な日付文字列返す唯一のソリューションはmoment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

素敵できれい!!!!


これは、私の場合、utc形式であることが判明した唯一のソリューションでした。ありがとう
Luis Febro

3

utcなどの任意の日付を変換するには:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
これは本当に私の日を救った!
HVシャルマ

この答えは間違っています。タイムゾーンオフセットを2回適用しmoment().utc()ます。UTCの値を返し、次に.format( "YYYY-MM-DD HH:mm:ss" )タイムゾーンオフセットなしでUTCに設定されている文字列を返すため、ローカルとして解析されます。デフォルトのモーメント形式と一致しないため、組み込みのパーサーによって解析されます。ECMAScriptでサポートされている形式とも一致しないため、解析は実装に依存します。とにかく、ローカルとして解析されるため、日付の時刻値を作成するときにタイムゾーンオフセットが再度適用されます。
RobG

3

質問は少しあいまいです。私はこれを説明するために最善を尽くします。まず、使用方法を理解する必要があります moment-timezoneのTypeError:moment()。tzは関数はないため、この回答によると 、デフォルトのモーメントではなく、moment-timezoneからモーメントをインポートする必要があります(もちろん、最初にnpm install moment-timezoneをインストールする必要があります!)。間違いがないように、

const moment=require('moment-timezone')//import from moment-timezone

タイムゾーン機能を使用するには、moment.tz( "date_string / moment()"、 "time_zone")を使用します(詳細については、https://momentjs.com/timezone/にアクセスしてください)。この関数は、特定のタイムゾーンを持つモーメントオブジェクトを返します。間違いがないように、

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

ここで、モーメントのtoDate()(ISO 8601形式変換)を使用してnewYork(モーメントオブジェクト)を変換しようとすると、英国グリニッジの時刻が取得されます。詳細については、この記事をご覧ください。 UTCに関する https://www.nhc.noaa.gov/aboututc.shtmlをください。ただし、この形式でローカル時間(この例ではニューヨーク時間)が必要な場合は、.utc(true)メソッドを引数trueとともにモーメントオブジェクトに追加します。間違いがないように、

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

要するに、 moment.tzは指定されたタイムゾーンを考慮し、ローカル時間とグリニッジの時間を比較して結果を提供します。これがお役に立てば幸いです。


2

2018年6月の時点で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

Angular5 +を自由に使用できる場合は、ここでタイムゾーン関数よりもdatePipe機能を使用してください。私のプロジェクトはAngular2のみに制限されているため、moment.jsを使用する必要があります。


1

試す(formatステップなし)

new Date(moment())


new Date(moment())と同等new Date()です。タイムゾーンはdにのみ設定されます。
RobG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.