Пытался преобразовать формат даты, но не работает. мой ввод - 23 октября 2054 г., вывод должен быть как 2054-10-23. Как это сделать в javascript? мой код не работает.

function formatDate(date) {
  var m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  var d = new Date(date),
    month = '' + (d.getMonth() + 1),
    day = '' + d.getDate(),
    year = d.getFullYear();

  if (month.length < 2)
    month = '0' + month;
  if (day.length < 2)
    day = '0' + day;

  return [year, month, day].join('-');
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];

var results=formatDate(dates);

console.log(results.join('\n'),+'\n');

Вывод должен быть

2054-10-23  
2014-07-29  
2054-05-12 
2050-06-20 
2059-12-23
0
kayu s 23 Янв 2021 в 22:07

7 ответов

Лучший ответ

Вот грязное решение с регулярным выражением, которое не использует объект Date:

function formatDate(date) {
  var newDates = date.map((item) => {
    var m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var day = item.match(/\d+/)[0];
    day = day < 10 ? "0" + day : day;
    var month = m.indexOf(item.match(/\s([A-Za-z]{3})\s/)[1]) + 1;
    month = month < 10 ? "0" + month : month;
    var year = item.match(/\d{4}$/)[0];
    return `${year}-${month}-${day}`;
  });
  return newDates;
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
console.log(formatDate(dates));
1
Wais Kamal 23 Янв 2021 в 20:06

Я только что сделал это вручную

function formatDate(date) {
  var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  [d,m,y]=date.split(' ');
  d=d.split('').filter(a=>!isNaN(a)).join('');
  return [y,m,d].join('-');
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];

dates.forEach(a=>console.log(formatDate(a)))
0
The Bomb Squad 23 Янв 2021 в 19:29

Одним словом, МОМЕНТ! :)

Если вы можете избавиться от -th, -rd в номере дня, вы можете использовать эту замечательную библиотеку (которая чрезвычайно гибкая и полезная). -> https://momentjs.com/

var dates = ["23 Oct 2054", "29 Jul 2014", "12 May 2054", "20 Jun 2050", "23 Dec 2059"];

console.log(dates.map(date => moment(date, 'DD MMM YYYY').format('YYYY-MM-DD')));
<script src="https://momentjs.com/downloads/moment.js"></script>
<div id='html'></div>
0
Riccardo Bertolini 23 Янв 2021 в 19:31

Первая проблема заключается в том, что вы передаете массив функции, которая не принимает массив. Во-вторых, вы передаете в Date () недопустимый формат даты.

Это не использует Date (). Предполагается, что последние 4 цифры - это год, первые 1-2 цифры - это день, а месяц - в середине. В формате даты допускается регистр без учета регистра и целый месяц.

function formatDate(date) {
  var m = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
  var month = String(m.indexOf(date.split(/[\s-]/)[1].slice(0, 3).toLowerCase())+1),
    day = date.split(/[^0-9]/)[0],
    year = date.slice(-4);
    
  if (month.length < 2)
    month = '0' + month;
  if (day.length < 2)
    day = '0' + day;

  return [year, month, day].join('-');
}

;
for (var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th dec 2059"], i=0; i<dates.length; i++) {
    console.log(formatDate(dates[i]));
}
0
PHP Guru 23 Янв 2021 в 19:32

Для этого вы можете использовать приведенный ниже код.

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
console.log(formatDate(dates));


function formatDate(date) {
  var mainArr = [];
   if(!Array.isArray(date)) {
      date = [date];
   }
   for(i=0;i<date.length;i++) {
        var dateVal = date[i];
        var dateValArr = dateVal.split(' ');
        var filterDateArr = [];
        for(j=0;j<dateValArr.length;j++) {
          var val = dateValArr[j]
          if(j==0) { 
            var val = dateValArr[j].replace(/\D/g, ""); 
          }
          filterDateArr.push(val);
        }
        var filterDate = filterDateArr.join(' ');
        var d = new Date(filterDate),
            month = '' + (d.getMonth() + 1),
            day = '' + d.getDate(),
            year = d.getFullYear();

        if (month.length < 2) {
            month = '0' + month;
            }
        if (day.length < 2) {
            day = '0' + day;
            }
            mainArr.push([year, month, day].join('-'));
      }
   return mainArr;
}
0
Amit Saini 23 Янв 2021 в 19:34

В вашем примере вы передаете массив в свою функцию, когда она ожидает строку. Вы также получаете недопустимый объект даты, потому что Date не принимает ваш формат.

Date примет дату ISO (2054-10-23), короткую дату (23.10.2054) или длинную дату (23 октября 2054 года). Ваш формат очень близок к формату «длинной даты».

Если удалить «-th», «-nd» или «-st» из дат, он станет принятым длинным форматом даты, который вы можете передать при инициализации нового Date:

new Date(date.replace(/th|nd|st/, ""));

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

Очищенный пример:

function formatDate(date) {
  const dateObj = new Date(date.replace(/th|nd|st/, ""));
  let year = dateObj.getFullYear();
  let month = dateObj.getMonth() + 1;
  let day = dateObj.getDate();

  if (month.length < 2) month = "0" + month;
  if (day.length < 2) day = "0" + day;

  return [year, month, day].join("-");
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
dates.forEach(date => console.log(formatDate(date)));

Я рекомендую использовать date-fns или момент при работе с датами. Форматировать их становится намного проще!

0
Sem 23 Янв 2021 в 19:49

Вы передаете массив функции и работаете с одним элементом, также недопустимая строка передается объекту Date. Посмотрите код ниже

function formatDate(dates) {
var result=[]
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (i = 0; i < dates.length; i++) {
    [d,m,y]=dates[i].split(' ');
    day=d.slice(0,d.length-2)
    month = (months.indexOf(m)+1).toString();
    year = y;

    if (month.length < 2)
      month = '0' + month;
    if (day.length < 2)
      day = '0' + day;
    result.push([year, month, day].join('-'));
}
return result;
}

var dates = ["23th Oct 2054", "29th Jul 2014", "12th May 2054", "20th Jun 2050", "23th Dec 2059"];
console.log(formatDate(dates));
0
Kuroko 23 Янв 2021 в 19:53
65863324