bez dodatkowych bibliotekami można użyć metod użytkowych poniżej aby wykonać następujące czynności:
var dateFromPicker = getDateFromPicker();
var dateUtc = localAsUtc(dateFromPicker);
var iso = dateUtc.toISOString(); // returns "2016-12-06T00:00:00.000Z"
/**
* <b>WARNING</b>: This method should only be used in conjunction with components that handle local dates (i.e. date pickers).
*
* Returns a local date constructed from a UTC date (shifts the time by the local time zone). E.g.:
* <ul><li>2016-01-01T00:00Z (UTC) -> 2016-01-01T00:00-0100 (CVT)
* <li>2016-01-01T00:00Z (UTC) -> 2016-01-01T00:00+0100 (CET)
* </ul>
* @param date a date in UTC time zone
* @returns {Date} the same date & time in the local time zone
*/
function utcAsLocal(date) {
if (isNotValidDate(date)) {
return null;
}
return new Date(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),
date.getUTCMilliseconds()
);
}
/**
* <b>WARNING</b>: This method should only be used in conjunction with components that handle local dates (i.e. date pickers).
*
* Returns a UTC date constructed from a local date (shifts the time by the local time zone). E.g.:
* <ul><li>2016-01-01T00:00-0100 (CVT) -> 2016-01-01T00:00Z (UTC)
* <li>2016-01-01T00:00+0100 (GMT) -> 2016-01-01T00:00Z (UTC)
* </ul>
* @param date a date in UTC time zone
* @returns {Date} the same date & time in the UTC time zone
*/
function localAsUtc(date) {
if (isNotValidDate(date)) {
return null;
}
return new Date(Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds()
));
}
function isValidDate (date) {
return !isNotValidDate(date);
}
function isNotValidDate(date) {
return date == null || isNaN(date.getTime());
}
Oto kilka przykładów, które przed i po UTC symulują stref czasowych:
var date;
// simulate a datepicker in (CET)
date = new Date("2016-12-06T00:00:00.000+0100");
date.toISOString(); // "2016-12-05T23:00:00.000Z"
date = localAsUtc(date);
date.toISOString(); // "2016-12-06T00:00:00.000Z" sent to server
// simulate a datepicker in (CVT)
date = new Date("2016-12-06T00:00:00.000-0100");
date.toISOString(); // "2016-12-06T01:00:00.000Z"
date = localAsUtc(date);
date.toISOString(); // "2016-12-06T00:00:00.000Z" sent to server
// setting the datepicker date (CET)
date = new Date("2016-12-06T00:00:00.000Z"); // received from server
date.toISOString(); // "2016-12-06T00:00:00.000Z"
date = utcAsLocal(date); // set datepicker with this date shows (06/12/2016)
date.toISOString(); // "2016-12-05T23:00:00.000Z"
// setting the datepicker date (CVT)
date = new Date("2016-12-06T00:00:00.000Z"); // received from server
date.toISOString(); // "2016-12-06T00:00:00.000Z"
date = utcAsLocal(date); // set datepicker with this date shows (06/12/2016)
date.toISOString(); // "2016-12-06T01:00:00.000Z"
, ale odpowiedź nie byłaby kompletna, gdyby nie wspomnieć o moment.js, co znacznie ułatwia obsługę terminów.
Dzięki za odpowiedź, ale kod mówi nam tylko, jak sformatować dane wyjściowe. Nie informuje, jak zmienić format czasu z czasu lokalnego na czas UTC. – user1599647