簡體   English   中英

moment.js無法將utc日期轉換為本地日期

[英]moment.js unable to convert utc date to local date

我有以下日期的utc格式,我想轉換並顯示為本地日期時間。

// utc
date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)';

// convert to local
moment.utc(date).local().format("ddd MMM DD YYYY HH:mm:ss");

使用上述結果的預期結果應為:

Thu Oct 27 2016 08:00:00

但實際結果顯示如下,即時間不變?

Thu Oct 27 2016 07:00:00

一些東西:

  • 您的輸入是一個非標准格式的字符串。 您可能通過獲取Date對象並調用.toString()函數來獲得它,但這並不意味着它適合於按時解析。 如果你查看調試控制台,你會發現一條警告消息,因為你傳入的東西本身並不理解,所以它將它傳遞回Date構造函數。 請參閱用戶指南 ,該指南說明了在進行自定義輸入時必須傳遞格式說明符。

  • 您的輸入包含時區偏移量+0100 這意味着7:00時間是UTC + 1,相當於UTC時間6:00。 這是您第一次使用moment.utc(yourInput)解析時的值

  • 然后在調用local()函數時將6:00 UTC轉換回本地時間。 那是你看到的7:00 UTC + 1。

如何解決這個問題取決於你實際想做什么。 你說你預計8:00 UTC,但是你輸入的輸入沒有意義,因為7:00 (+1) == 6:00 (+0)

如果你的意思是你想斷言原始時間值確實是UTC,而不是UTC + 1,即使它在你的輸入中,那么提供一個只包含你關心的部分的格式字符串。 Moment的默認松散解析模式將忽略任何無關的東西。

date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)';
moment.utc(date, 'ddd MMM DD YYYY HH:mm:ss').local().format("ddd MMM DD YYYY HH:mm:ss");

換句話說,您的輸入日期僅為Thu Oct 27 2016 07:00:00 ,其余部分將被忽略。 您通過將其傳遞到moment.utc來聲明它是UTC,然后當您將其轉換為本地時,它將在8:00結束。

但是,雖然這就是你要求的,但我的猜測是date實際上是一個JavaScript Date對象,其字符串輸出為.toString()就是你在這里展示的。 在這種情況下, Date對象已經表示特定的時間點,即UTC時間6:00。 因此,無論你是做moment.utc(date).local()還是只做moment(date)都沒關系。 兩者都將在同一時刻留給您,以當地時區為代表。

你可能想回到你的輸入,並在你認為它實際上是一個UTC值時弄清楚你是如何把它包含在GMT+0100的。 考慮一下,如果您實際上有8:00 UTC,那么您的輸入將是09:00 GMT+0100

您可能希望將Moment TimeZone與MomentJS一起使用( http://momentjs.com/timezone/

date = moment.tz("Thu Oct 27 2016 07:00:00", "GMT Standard Time");
date.clone().local().format('ddd MMM DD YYYY HH:mm:ss');

編輯:

刪除utc部分可以在沒有Moment TimeZone的情況下為我修復它:

date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)';
moment(date).local().format('ddd MMM DD YYYY HH:mm:ss');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM