最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin5浏览0评论

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?

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?

Share Improve this question edited Jun 6, 2017 at 9:42 JoeCodeFrog asked Jun 6, 2017 at 9:07 JoeCodeFrogJoeCodeFrog 4182 gold badges5 silver badges14 bronze badges 3
  • tt is not a valid token for moment parsing, you have to pass a zone name to .tz function (e.g."Europe/Berlin" or "UTC"), toDate() converts moment to JavaScript date that is local. – VincenzoC Commented Jun 6, 2017 at 9:13
  • tt seems to work for AM/PM... so should .tz("UTC") work? because it doesnt seem like it works – JoeCodeFrog Commented Jun 6, 2017 at 9:16
  • 1 tt is not listed in moment docs, use A for parsing AM/PM (see here). I do not understand what you are trying to achieve, .tz("UTC") converts moment to UTC (see also utc()), maybe your problem is that you are converting to native JavaScript date using toDate(). At the moment, I can not provide a solution, just wanted to highlight some problems with your initial code. – VincenzoC Commented Jun 6, 2017 at 9:29
Add a ment  | 

3 Answers 3

Reset to default 4

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 putes 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'));

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.

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)

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论