moment-timezones.js, how to convert date in spesific timezone to utc, disregarding my local timezone?

China☆狼群 提交于 2020-06-28 06:22:53

问题


my system uses timezone UTC+03:00 ,

im trying to get a date in string format, represented by NY timezone, and convert it to a Date object in utc

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

doesnt work correctly

how am i even suppose to convert to utc time?


-----------edit---------------

i got it to work, using the timezone "Africa/Accra" , where UTC offset is 0, and ther is no daylight savings time:

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

but this solution is a bad workaround, and if the government of Accra decide to change the time laws, will stop working!

is there a way to set the utc offset to 0 in momentjs-timezones?


回答1:


As Álvaro González mentioned, that Date object does not contain Time zone information. I do the following:

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

where date is a date object or a string (e.g. '2017-10-30 16:30:00.0000')

so, I change date from currentTimezone to newTimezone and after that new Date object will be returned

  1. Let's change '2017-10-30 16:30:00.0000' from UTC to America/Toronto (UTC-4)

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

    And I got

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

    GMT+0400 is my timezone and console.log() just shows it with any date object and it can mislead you. Please, don't look at the this timezone.

  2. Let's change '2017-10-30 16:30:00.0000' from Europe/Samara (UTC+4) to America/Toronto (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')) 
    

    Firstly, moment.tz undertands that date has no timezone information and associate with Europe/Samara (UTC+4) timezone. After that computes difference between new and old timezone (it's -8 hours in this case)

    And returns result

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

And answer on your question

If xsltDate is a date object or string which do not contain timezone information

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

If xsltDate contain timezone information (e.g.'2013-06-01T00:00:00-04:00'), then no need to tell moment.tz which timezone xlsxDate has, just mention a new timezone

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



回答2:


Short answer is that you cannot.

The .toDate() method of the Moment library returns a native Date object. Such objects do not keep memory of any specific time zone (that's one of the reasons to use Moment in the first place), they just keep track of the exact time moment represented and merely pick a time zone when formatting to string, which is either UTC or the browser's time zone (not an arbitrary one).

The long answer is that you're probably getting correct results but are printing them with a method that uses the browser's time zone.




回答3:


i found a function that does what i was trying to do, it belongs to the momentjs library itself: utcOffset(n) sets the offset to n.

(i also had to explicitly write the date string format correctly, thanks VincenzoC)

this is the code i was trying to write:

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

however, the toDate function changes the timezone to my local timezone anyway, so .utcOffset(0) is redundat, and i can just use moment this way:

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

and change the Date objects date to utc time later (in my case, the JSON.stringify stuff i use later does that for me)



来源:https://stackoverflow.com/questions/44385815/moment-timezones-js-how-to-convert-date-in-spesific-timezone-to-utc-disregardi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!