Пытался преобразовать формат даты, но не работает. мой ввод - 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
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));
Я только что сделал это вручную
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)))
Одним словом, МОМЕНТ! :)
Если вы можете избавиться от -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>
Первая проблема заключается в том, что вы передаете массив функции, которая не принимает массив. Во-вторых, вы передаете в 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]));
}
Для этого вы можете использовать приведенный ниже код.
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;
}
В вашем примере вы передаете массив в свою функцию, когда она ожидает строку. Вы также получаете недопустимый объект даты, потому что 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 или момент при работе с датами. Форматировать их становится намного проще!
Вы передаете массив функции и работаете с одним элементом, также недопустимая строка передается объекту 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));
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.