Как получить строку ISO8601 со смещением времени в JavaScript?

Я хочу получить строку времени в

"%Y%m-%dT%H:%M:%S%z"

отформатировать в хроме с помощью JavaScript. Но хром просто возвращает символ «Z», как показано ниже.

new Date().toISOString()
->"2015-07-23T07:41:36.617Z"

Хотя я знаю, что верхний результат верен, мой проект также включает приложение C++. Итак, я хочу унифицировать формат даты, как показано ниже.

2015-07-23T16:41:36.617+09:00

Итак, есть ли хорошие способы реализовать мой формат даты?

Спецификация ES6

http://www.ecma-international.org/ecma-262/6.0/#sec-date-time-string-format


person jef    schedule 23.07.2015    source источник


Ответы (2)


Итак, есть ли хорошие способы реализовать мой формат даты?

Если вам нужна версия ISO-8601 по местному времени со смещением, все, что вы можете сделать, это использовать не-UTC версии getDay, getMonth и т. д., получить смещение часового пояса из getTimezoneOffset и создайте строку самостоятельно. (Или используйте библиотеку, например MomentJS.) В спецификации нет ничего, что могло бы это сделать.

person T.J. Crowder    schedule 23.07.2015

Если есть хороший способ зависит. Дело в том, что для этого нет встроенного метода. Но вы можете создать его самостоятельно, используя Date.getTimezoneOffset() и выполняя некоторый модуль. Вот зацепка:

// set up date 2009-02-13T23:31:30.123Z (equivalent to 1234567890123 milliseconds):
var localDate = new Date(1234567890123);
// get local time offset, like -120 minutes for CEST (UTC+02:00):
var offsetUTC = new Date().getTimezoneOffset();
// set date to local time:
localDate.setMinutes(localDate.getMinutes() - offsetUTC);
offsetUTC = {
    // positive sign unless offset is at least -00:30 minutes:
    "s": offsetUTC < 30 ? '+' : '-',
    // local time offset in unsigned hours:
    "h": Math.floor(Math.abs(offsetUTC) / 60),
    // local time offset minutes in unsigned integers:
    "m": ~~Math.abs(offsetUTC) % 60
};
offsetUTC = offsetUTC.s + // explicit offset sign
            // unsigned hours in HH, dividing colon:
            ('0'+Math.abs(offsetUTC.h)+':').slice(-3) +
            // minutes are represented as either 00 or 30:
            ('0'+(offsetUTC.m < 30 ? 0 : 30)).slice(-2);

localDate = localDate.toISOString().replace('Z',offsetUTC);
// === "2009-02-13T23:31:30.123+02:00" (if your timezone is CEST)
     

Или чуть менее подробно:

localDate = localDate.toISOString().replace('Z',(offsetUTC<30?'+':'-')+
            ('0'+Math.floor(Math.abs(offsetUTC)/60)+':').slice(-3)+
            ('0'+((~~Math.abs(offsetUTC)%60)<30?0:30)).slice(-2));

Обратите внимание, что…

person dakab    schedule 23.07.2015