Я использую JavaScript и JQuery, и у меня есть такая строка (неизменяемый ответ XML):

var str = "2017-01-08T16:06:52+00:00";

Как я могу преобразовать в дату, как это:

08 january 2017, 16:06:52

Или по крайней мере:

08 01 2017, 16:06:52

Я пытался использовать .replace() вроде:

str = str.replace(/(\d{4})-(\d{2})-(\d{2})T(\d{8}).*/,'$2 $3 $1, $4');

Но это не работает. :(

4
paolobasso 8 Янв 2017 в 19:38

3 ответа

Лучший ответ

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

var str = "2017-01-08T16:06:52+00:00";
var date = new Date(str);
var months = [ "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december" ];

var dateString = ("00" + date.getDate()).slice(-2) + ' ' + months[date.getMonth()] + ' ' + date.getFullYear() + ', ' + ("00" + date.getHours()).slice(-2) + ':' + ("00" + date.getMinutes()).slice(-2) + ':' + ("00" + date.getSeconds()).slice(-2);

console.log(dateString);

Обратите внимание, что это можно упростить с помощью библиотеки форматирования даты (например, MomentJS или DateJS), однако включение всей библиотеки для форматирования одной даты довольно расточительно. Если вам нужно делать это несколько раз на вашем сайте, то они могут того стоить.

Также обратите внимание, что в англоязычных странах названия месяцев должны быть заглавными, поэтому рассмотрите возможность изменения формата для этого случая.

6
Rory McCrossan 8 Янв 2017 в 16:42

Ваше регулярное выражение не совсем верно, \d{8} будет соответствовать 8 последовательным цифрам, но там также есть двоеточия, вам нужно что-то вроде:

var str = "2017-01-08T16:06:52+00:00"
str = str.replace(/(\d{4})-(\d{2})-(\d{2})T(.{8}).*/, '$2 $3 $1, $4');
console.log(str)

Заменить номер месяца на название - это просто немного больше работы:

function reformatDate(s) {
  var months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
  var b = s.split(/\D/);
  return b[2] + ' ' + months[b[1]-1] + ', ' + b[0] + ' ' + b[3] + ':' + b[4] + ':' + b[5];
}
  
  
var s = "2017-01-08T16:06:52+00:00"  
console.log(reformatDate(s));

Будьте осторожны, используя конструктор Date (и Date.parse) для разбора строк, он в значительной степени зависит от реализации.

Если вы хотите представить дату и время в часовом поясе клиента, то проанализируйте строку в Date, а затем верните ее в виде строки. Библиотека типа fecha.js подходит для этого. Он маленький и просто выполняет синтаксический анализ и форматирование, например

var s = '2017-01-08T16:06:52+00:00'
var d = fecha.parse(s,'YYYY-MM-DDTHH:mm:ssZZ');

console.log(fecha.format(d,'dd MMMM, YYYY HH:mm:ss'));
0
RobG 8 Янв 2017 в 22:43

В качестве альтернативы, если вы добавляете библиотеку, вы можете использовать moment.js. Вы можете позвонить .format и передать желаемый результат в быть, например:

var str = "2017-01-08T16:06:52+00:00";
var momentDate = moment(str);

console.log(momentDate.format('DD MMMM YYYY HH:mm:ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js"></script>
0
BrunoLM 8 Янв 2017 в 23:10