Преобразование строки dd-mm-yyyy на сегодняшний день

Я пытаюсь преобразовать строку в формате dd-mm-yyyy в объект даты в JavaScript, используя следующее:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val() содержит дату в формате dd-mm-yyyy. Когда я делаю следующее, я получаю "Недействительная дата":

alert(f);

Это из-за символа '-'? Как я могу это преодолеть?

Ответ 1

Разделить на "-"

Разобрать строку на нужные вам части:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

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

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

Почему бы не использовать регулярные выражения?

Потому что вы знаете, что будете работать над строкой, состоящей из трех частей, разделенных дефисами.

Однако, если вы искали эту же строку в другой строке, регулярным выражением будет путь.

Повторное использование

Поскольку вы делаете это более одного раза в своем примере кода, и, возможно, где-то еще в вашей кодовой базе, заключите его в функцию:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Используя как:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

Или, если вы не возражаете против jQuery в вашей функции:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Используя как:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

Современный JavaScript

Если вы можете использовать более современный JS, деструктуризация массива также подойдет:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

Ответ 2

пример регулярного выражения:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

Ответ 3

Другая возможность:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Сопоставьте цифры и измените их порядок.

Ответ 4

var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

Ответ 5

Используя пример moment.js:

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

Ответ 6

Используйте этот формат: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00

Ответ 7

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

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

Ответ 8

В моем случае

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Результат: Пн 02 Ноябрь 2015 04:40:13 GMT + 0100 (CET) то я использую .getTime() для работы с миллисекундами

Ответ 10

Посмотрите Datejs на все эти мелкие проблемы, связанные с датой. Вы также можете решить эту проблему с помощью функции parseDate

Ответ 11

Вы можете использовать Regexp.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

Ответ 12

В принятом ответе есть ошибка

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Подумайте, содержит ли указатель даты "77-78-7980", что, очевидно, не является действительной датой. Это приведет к:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

Что, вероятно, не желаемый результат.

Причина этого объясняется на сайте MDN:

Если Date вызывается как конструктор с более чем одним аргументом, если значения превышают их логический диапазон (например, 13 указывается как значение месяца или 70 для значения минут), смежное значение будет скорректировано. Например, new Date(2013, 13, 1) эквивалентна new Date(2014, 1, 1).


Лучший способ решить проблему:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date('${yyyy}-${mm}-${dd}');
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Это дает вам возможность обрабатывать неверный ввод.

Например:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It all gone bad");
} else {
  // Do something with your valid date here
}

Ответ 13

версия одного вызова с использованием момента moment(from, "DD-MM-YYYY").toDate()

Ответ 14

new Date().toLocaleDateString();

просто, просто передайте свою дату js Date Object