Как проанализировать форматированный текст даты, чтобы иметь объект Date в JavaScript - PullRequest
1 голос
/ 31 марта 2019

у меня есть форматированное значение даты: '20190331T141553Z', получая недопустимую ошибку даты при использовании новой даты ('20190331T141553Z').

Как проанализировать форматированное значение, чтобы получить объект Date?

Ответы [ 5 ]

4 голосов
/ 31 марта 2019

Вы можете использовать replace, используя регулярное выражение для вставки пропущенных разделителей:

var str =  '20190331T141553Z';
var dt = new Date(str.replace(/^(....)(..)(..T..)(..)(..)/, "$1-$2-$3:$4:$5"));

console.log(dt);
1 голос
/ 31 марта 2019

Мне всегда кажется неоптимальным синтаксический анализ строки для создания другой строки, которая затем анализируется встроенным синтаксическим анализатором (общеизвестно непостоянным). После того, как у вас есть детали, вы можете передать их конструктору Date напрямую:

function parseDate(s) {
  var b = s.match(/\d\d/g);
  return new Date(Date.UTC(b[0]+b[1],b[2]-1,b[3],b[4],b[5],b[6]));
}

console.log(parseDate('20190331T141553Z').toISOString());
1 голос
/ 31 марта 2019

Вы можете использовать следующую функцию для предоставленного формата

const toDate = str => {
   const year = str.slice(0, 4)
   const month = str.slice(4, 6)
   const day = str.slice(6, 8)
   const dateStrFormatted = [year, month, day].join('-')
   const timeStr = str.slice(str.indexOf('T') + 1)
   const hours = timeStr.slice(0, 2)
   const minutes = timeStr.slice(2, 4)
   const seconds = timeStr.slice(4, 6)
   const timeStrFormatted = [hours, minutes, seconds].join(':')

   return new Date(`${dateStrFormatted}T${timeStrFormatted}Z`)
}

Используйте это так

const myDate = toDate('20190331T141553Z')
1 голос
/ 31 марта 2019
var str = '20190331T141553Z'

function timeFromString(str){
  var t = [str.substring(0,4),'-', str.substring(4,6),'-', 
  str.substring(6,8), 'T', str.substring(9,11), ':', 
  str.substring(11,13), ':', 
  str.substring(13,15)].join(',').replace(/,/g,'');
  return new Date(t);
}

timeFromString(str);
// 2019-03-31T18:15:53.000Z

Или вы можете использовать регулярное выражение:

function dateFromString(str){
    var regex = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/;
    return new Date(str.replace(regex, "$1-$2-$3T$4:$5:$6"));
}

Чтобы объяснить регулярное выражение:

// ^ means start of string
// (\d{4}) capture group 1 is 4 digits (year)
// (\d{2}) capture group 2 is 2 digits (month)
// (\d{2}) capture group 3 is 2 digits (day)
// T just matches the T
// (\d{2}) capture group 4 is 2 digits (hours)
// (\d{2}) capture group 5 is 2 digits (minutes)
// (\d{2}) capture group 6 is 2 digits (seconds)

// now we can use the numbered capture groups to replace them in the string. 
// they are auto-numbered by sequence.
0 голосов
/ 31 марта 2019

Вы можете использовать несколько способов извлечь дату:

Струнные манипуляции

let dateStr = '20190331T141553Z';

let year = dateStr.slice(0, 4);
let month = dateStr.slice(4, 6);
let day = dateStr.slice(6, 8);
let hours = dateStr.slice(9, 11);
let minutes = dateStr.slice(11, 13);
let seconds = dateStr.slice(13, 15);

let dateISO = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}Z`;
console.log(dateISO);

let date = new Date(dateISO);
console.log(date.toLocaleString());

Как указано trincot в комментарии, конструктор даты, который принимает каждую часть даты и времени отдельно, будет обрабатывать их как локальное время, поэтому вам нужно сгенерировать строку, которая new Date можно разобрать. Это будет полное представление даты ISO 8601 . Следует отметить, что технически ваша строка имеет формат ISO 8601, поскольку разделители (- и :) являются необязательными. Однако JavaScript официально поддерживает упрощенную версию этого стандарта, которая включает все разделители . Поддержка других вариантов даты может отличаться в разных реализациях, поэтому лучше использовать официально поддерживаемый формат.

Регулярное выражение

Аналогично использованию строковых манипуляций, но более коротким, поскольку вы можете просто использовать группы захвата и деструктуризацию для сокращения кода.

let dateStr = '20190331T141553Z';
let regex = /(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z/;

let [, year, month, day, hours, minutes, seconds] = dateStr.match(regex);

let dateISO = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}Z`;
console.log(dateISO);

let date = new Date(dateISO);
console.log(date.toLocaleString());

Использование библиотеки Moment.js

Почти все, что связано с датами, проще с Moment. Это популярная библиотека для этого. Вам не нужно это только для одного извлечения, но если вы обнаружите, что ваш проект будет обрабатывать даты и время больше, возможно, стоит включить его.

let dateStr = '20190331T141553Z';
let format = "YYYYMMDD[T]hhmmssZ";

let momentDate = moment(dateStr, format);
console.log(momentDate)

let date = momentDate.toDate();
console.log(date.toLocaleString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...