Почему я не могу создать дату из строки, включающей миллисекунды? - PullRequest
1 голос
/ 10 апреля 2010

В JavaScript вы можете создать объект Date из строки, например

var mydate = new Date('2008/05/10 12:08:20');
console.log(mydate); //=> Sat May 10 2008 12:08:20 GMT+0200

Теперь попробуйте это, используя миллисекунды в строке

var mydate = new Date('2008/05/10 12:08:20:551'); // or '2008/05/10 12:08:20.551'
console.log(mydate); //=> NaN

Просто из любопытства: почему это так?

РЕДАКТИРОВАТЬ: спасибо за ваши ответы, которые все предлагают достаточное объяснение. Возможно, в будущем появится поддержка использования миллисекунд в строках даты. До тех пор, пока я не приготовлю это, которое может кому-нибудь пригодиться:

function dateFromStringWithMilliSeconds(datestr){
    var dat = datestr.split(' ')
        ,timepart = dat[1].split(/:|\./)
        ,datestr = dat[0]+' '+timepart.slice(0,3).join(':')
        ,ms = timepart[timepart.length-1] || 0
        ,date;
    date = new Date(datestr);
    date.setMilliseconds(ms);
    return date;
}

Ответы [ 3 ]

5 голосов
/ 10 апреля 2010

Если вы знаете различные компоненты, вы можете использовать эту перегрузку для конструктора Date:

var mydate = new Date(2008,6,10,12,8,20,551);

Примечание 6 для месяца, так как месяцы идут с 0-11.

При необходимости вы можете взять строковое представление и разделить его на составные части и передать их в этот конструктор:

var datestring = '2008/05/10 12:08:20:551';
var datearray = datestring.split(/\s|:|\//g)
var mydate = new Date(datearray[0], parseInt(datearray[1]) + 1 , datearray[2], datearray[3],datearray[4],datearray[5],datearray[6]);

Как описано в этом документе, перегрузка строки должна соответствовать RFC-1123 (что в свою очередь соответствует RFC-822 ), который не поддерживает миллисекунды.

4 голосов
/ 10 апреля 2010

DateString

Строковое значение, представляющее дату. Строка должна иметь формат, распознаваемый методом синтаксического анализа ( метки времени, соответствующие IETF RFC 1123 ).

Этот формат, кажется, не учитывает миллисекунды в дате ... Возможно, лучше просто определить дату без мс, а затем вызвать setMilliseconds().

1 голос
/ 10 апреля 2010

Стандарт ECMA-262 , раздел 15.9.1.15, действительно указывает миллисекунды в формате строки даты. Я предполагаю, что разработчики браузеров просто не удосужились реализовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...