2017-06-06 14 views
0

我的系統中使用時區UTC + 03:00,moment-timezones.js,如何將特定時區的日期轉換爲utc,無視當地時區?

我嘗試獲得字符串格式的日期,由紐約時區, 代表,將其轉換爲Date對象的UTC

const dateInNY = moment.tz(xlsxDate, "M/D/YYYY h:mm a", "America/New_York") 
    .tz("Z").toDate(); 

不工作正確

我甚至想如何轉換爲utc時間?


-----------編輯---------------

我得到它的工作,使用時區「非洲/阿克拉」,其中UTC偏移量爲0,且療法是沒有夏令時:

moment.tz(xlsxDate, "M/D/YYYY h:mm a", "America/New_York").tz("Africa/Accra") 

但這個解決方案是一個糟糕的解決辦法,如果阿克拉政府決定改變時法律,將停止工作!

有沒有辦法在utjs-timezones中設置utc偏移量爲0?

+0

' tt'不是用於時刻解析的有效標記,您必須將區域名稱傳遞給['.tz'](http://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/ )函數(例如「Europe/Berlin」或「UTC」),['toDate()'](http://momentjs.com/docs/#/displaying/as-javascript-date/)到本地的JavaScript日期。 – VincenzoC

+0

'tt'似乎適用於上午/下午... 因此應該.tz(「UTC」)工作?因爲它看起來並不像它的工作 – JoeCodeFrog

+1

'tt'沒有在時間文檔中列出,使用'A'解析'AM/PM'(參見[這裏](http://momentjs.com/docs/#/parsing/string) -格式/))。我不明白你想達到什麼目的,[] .tz(「UTC」)'](轉換時刻)到UTC(另請參閱['utc()'](http://momentjs.com/docs/#/manipulating/utc/)),也許你的問題是,你正在轉換到本地JavaScript日期使用'toDate()' 。目前,我無法提供解決方案,只是想強調一些初始代碼的問題。 – VincenzoC

回答

1

我發現,做什麼,我試圖做一個功能,它屬於momentjs庫本身:utcOffset(n)將偏移到n。

(我也有明確正確地寫上日期字符串格式,感謝VincenzoC)

這是代碼我試圖寫:

const dateInNY = moment.tz(xlsxDate, "M/D/YYYY h:mm a", "America/New_York"); 
const dateUTC = dateInNY.utcOffset(0).toDate(); 

然而,TODATE函數更改時區以我的本地時區,無論如何,所以.utcOffset(0)是redundat,我可以只使用時刻是這樣的:

const dateInNY = moment.tz(xlsxDate, "M/D/YYYY h:mm a", "America/New_York"); 
const dateUTC = dateInNY.toDate(); 

,改變Date對象日期爲UTC時間後來(在我的情況下,JSON.stringify東西,我後來用做對我來說)

1

簡短的回答是,你不能。

矩庫的.toDate() method返回本地Date對象。這些對象不會記憶任何特定的時區(這是首先使用Moment的原因之一),它們只是跟蹤所表示的確切時刻,而只是格式化爲字符串時選擇一個時區,這是UTC或瀏覽器的時區(不是任意的)。

長的答覆是,你可能得到正確的結果,但與使用瀏覽器的時區中的方法打印。

0

由於阿爾瓦羅·岡薩雷斯提到,Date對象不包含時區信息。 我執行以下操作:

new Date(moment.tz(date, currentTimezone).tz(newTimezone).format('YYYY/MM/DD HH:mm:ss')) 

其中日期是日期對象或一個字符串(例如,「2017年10月30日16點30分○○秒。0000' )

所以,我改變從currentTimezone日期newTimezone,之後新的Date對象將返回

  1. ,讓我們改變 '二零一七年十月三十○日16:從UTC 00.0000' 美國:30 /多倫多(UTC-4)

    new Date(moment.tz(date, 'UTC').tz('America/Toronto').format('YYYY/MM/DD HH:mm:ss')) 
    

    而且我得到了

    Mon Oct 30 2017 12:30:00 GMT+0400 
    

    GMT + 0400是我的時區和的console.log ()只顯示它與任何 日期對象,它可以誤導你。請不要看這個 時區。歐洲/薩馬拉(UTC + 4)美國/多倫多(UTC-4)

    new Date(moment.tz('2017-10-30 16:30:00.0000', 'Europe/Samara').tz('America/Toronto').format('YYYY/MM/DD HH:mm:ss')) 
    

    首先,moment.tz undertands

  2. ,讓我們改變 '00.0000二零一七年十月三十〇日16:30'該日期沒有時區信息,並與歐洲/薩馬拉(UTC + 4) 時區關聯。之後計算新老 時區之間的差異(這是在這種情況下-8小時)

    ,並返回結果

    Mon Oct 30 2017 08:30:00 GMT+0400 
    

,並回答你的問題

如果xsltDate是日期對象或字符串不包含時區信息

dateUTC = new Date(moment.tz(xlsxDate, "America/New_York").tz("UTC").format('YYYY/MM/DD HH:mm:ss')); 

如果xsltDate包含時區信息(eg'2013-06-01T00:00:00-04:00),則沒有必要告訴moment.tz其時區xlsxDate了,只提一個新的時區

dateUTC = new Date(moment.tz(xlsxDate, "UTC").format('YYYY/MM/DD HH:mm:ss')); 
相關問題