Запрети toIsoString изменить день - PullRequest
0 голосов
/ 30 апреля 2018

Когда я делаю это:

new Date('4/7/2018').toISOString();

Я получаю: "2018-04-06T22:00:00.000Z"

Как я могу получить строку ISO, но без изменения даты с 7 на 6? Я в основном хочу ту же дату, месяц и год.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Используйте 2018Z в поле вашего года:

var res = new Date('4/7/2018Z').toISOString();
console.log(res);
0 голосов
/ 30 апреля 2018

Строки даты не имеют часового пояса. Использование встроенного синтаксического анализатора для любого формата, отличного от указанного в ECMA-262 (ограниченное подмножество ISO 8601), зависит от реализации и не должно использоваться, см. Почему Date.parse дает неверные результаты

Несколько вариантов - проанализировать строку как значения UTC, а затем использовать toISOString и удалить завершающий Z, или вы можете просто переформатировать строку, например,

var s = '4/7/2018';

// Parse string in m/d/y format and return
// in ISO 8601 format
function parseDMY(s) {
  var b = s.split(/\D/);
  return new Date(Date.UTC(b[2],b[0]-1,b[1])).toISOString().slice(0,19);
}

console.log(parseDMY(s));

function reformatDate(s) {
  var b = s.split(/\D/);
  function z(n){return (n<10?'0':'')+n}; 
  return `${b[2]}-${z(b[0])}-${z(b[1])}T00:00:00`;
}

console.log(reformatDate(s));

Но на самом деле, если у вас просто есть дата, ее следует оставить как просто дату, поэтому:

var s = '4/7/2018';

// Assume date is M/D/Y
function reformatDate(s) {
  var a = s.split(/\D/).map(n=>(n<10?'0':'')+n);
  return a[2]+'-'+a[0]+'-'+a[1];
}

console.log(reformatDate(s));
0 голосов
/ 30 апреля 2018

Я думаю, что это связано с локалью машины (то есть вы находитесь на gmt + 2, поэтому 4/7/2018 в 00:00:00 действительно 2018-04-06T22: 00: 00.000Z)

Вы могли бы сделать new Date('4/7/2018 GMT').toISOString();

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