Как всем известно, все методы даты работают только в контексте локального времени (пользователя) или UTC, но иногда хочется поработать в других контекстах (временных зонах), стандарт js забыл про антагониста для getTimezoneOffset, а я написал свой
/**
* Set the timezone offset from the local timezone offset.
* Argument "minutes" => -UTC±XX:XX, default = local offset.
* Property "timezoneOffset" => last-set offset.
* Return => milliseconds.
*/
Date.prototype.setTimezoneOffset = function(minutes) {
var _minutes;
if (this.timezoneOffset == _minutes) {
_minutes = this.getTimezoneOffset();
} else {
_minutes = this.timezoneOffset;
}
if (arguments.length) {
this.timezoneOffset = minutes;
} else {
this.timezoneOffset = minutes = this.getTimezoneOffset();
}
return this.setTime(this.getTime() + (_minutes - minutes) * 6e4);
};
// Example
var date = new Date(), text = '\nExample\n\n';
// milliseconds
text += 'time1\t' + date.getTime() + '\n';
// UTC time
text += ' UTC\t' + date.toUTCString() + '\n';
// local time
text += 'local\t' + date + '\t' + date.timezoneOffset + '\n';
// -UTC-04:00 => 240
date.setTimezoneOffset(240);
text += 'set-4\t' + date + '\t' + date.timezoneOffset + '\n';
// -UTC+06:00 => -360
date.setTimezoneOffset(-360);
text += 'set+6\t' + date + '\t' + date.timezoneOffset + '\n';
// -UTC±00:00 => 0
date.setTimezoneOffset(0);
text += 'set 0\t' + date + '\t' + date.timezoneOffset + '\n';
// no argument => reset
date.setTimezoneOffset();
text += 'reset\t' + date + '\t' + date.timezoneOffset + '\n';
// Warning
// .getTime() returns the offset time after .setTimezoneOffset(offset != local)
text += '\nWarning\n\n';
// true time
text += 'time2\t' + date.getTime() + '\t(offset == local)\t' + date.timezoneOffset + '\n';
// -UTC+03:33 => -213
date.setTimezoneOffset(-213);
// false time
text += 'time3\t' + date.getTime() + '\t(offset != local)\t' + date.timezoneOffset + '\n';
// compute true time
text += 'time4\t' + (date.getTime() - (date.getTimezoneOffset() - date.timezoneOffset) * 6e4) + '\tcomputed\n';
console.log(text);