Convert milliseconds into UTC date object with UTC Time Zone

I am trying to convert milliseconds into UTC date object as below -

var tempDate = new Date(1465171200000);
// --> tempDate = Mon Jun 06 2016 05:30:00 **GMT+0530 (India Standard Time)** {}

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(),  tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds());
//--> _utcDate = Mon Jun 06 2016 00:00:00 **GMT+0530 (India Standard Time)** {}

Time is resetting to UTC time but Time Zone is still coming as GMT+0530 (India Standard Time). Is there any sure shot approach to convert milliseconds into UTC date object with UTC Time Zone?


Quoting from this answer (that I suggest you to read completely):

There is no time zone or string format stored in the Date object itself. When various functions of the Date object are used, the computer's local time zone is applied to the internal representation.

As time zone is not stored in the Date object there is no way to set it.

I see two options:

the first is to make use of a library (as suggested in the answer above). Quite popular now is Moment.js

the second (pure JavaScript - if it's a viable solution in your context):

Do the "time math" in your local timezone.

When you're ready to switch to UTC use toUTCString() method.

Of course you'll end up with a string as this let you store the time zone as long as the date time value.

As you won't be able to manipulate the date time as a Date object from now on this must be the last step.

var tempDate = new Date(1465171200000);
// Mon Jun 06 2016 05:30:00 GMT+0530

// Do your date time math here
// using the Date object's methods

var utcDateAsString = tempDate.toUTCString();
// Mon Jun 06 2016 00:00:00 GMT

You say:

Time is resetting to UTC time but Time Zone is still coming as GMT+0530 (India Standard Time). Is there any sure shot approach to convert milliseconds into UTC date object with UTC Time Zone?

But I think you misunderstand what is occurring. When you pass a number to the Date constructor as in:

new Date(1465171200000)

is it assumed to be milliseconds since the ECMAScript epoch (1970-01-01T00:00:00Z), so a Date object is created with that value as its internal time value. So Date objects are inherently UTC.

When you write that to a string, internally a human readable date string is generated based on the host timezone setting, which is why you see a date for GMT+0530 (that is your host system timezone setting). The Date object itself does not have a timezone, it's always UTC.

When you then use UTC values to create a "local" Date using:

new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), ...)

then the host timezone is used to generate a UTC time value equivalent to a "local" date for the associated values. You've effectively subtracted your timezone offset from the original time value so it now represents a different moment in time. You can get exactly the same result doing:

var d = new Date(1465171200000);
d.setMinutes(d.getMintues() + d.getTimezoneOffset());

which just shows a bit more clearly what's going on. Note that ECMAScript timezone offsets are in minutes and have the opposite sense to UTC, that is, they are negative (-) for east and positive (+) for west. So an offset of UTC+05:30 it is represented as -330 and you need to add it to "shift" a Date rather than subtract it.

var tempDate = new Date(1465171200000);

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(),  tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds());

console.log('Direct conversion to DatentempDate: ' + tempDate.toString());
console.log('Adjusted using UTC methodsn_utcDate: ' + _utcDate.toString());

tempDate.setMinutes(tempDate.getMinutes() + tempDate.getTimezoneOffset());
console.log('Adjusted using timezoneOffsetntempDate: ' + tempDate.toString());

If you create a Date from a Number , the local timezone is the one considered. But if you want to see what a timestamp would mean with the hours corrected for UTC, you could use a helper as such:

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

The usage would be:

var date = (1465171200000).toUTCDate();
链接地址: http://www.djcxy.com/p/46594.html

上一篇: 将ISO日期字符串转换为日期对象,而不考虑时区

下一篇: 使用UTC时区将毫秒转换为UTC日期对象