Конвертировать строку dd-mm-yyyy в дату

184

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

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

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

alert(f);

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

user559142
источник
Это происходит со всеми датами или с одной в частности?
kasdega

Ответы:

326

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

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

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)
}
Адриан Линч
источник
9
побей меня до этого ... но я все еще использую DateJ Это не совсем правильно из-за ошибки поста забора. месяц 0-11, поэтому вам нужно вычесть 1. f = новая дата (из [2], из [1] -1, из [0]);
kasdega
12
Выбранный ответ с ошибкой, которая выдает неправильные даты. Потрясающие!
epascarello
3
Cheers @kasdega - Отредактировал это ... некоторое время назад!
Адриан Линч
@AdrianLynch Как конвертировать "Месяц дд, гггг" в "MM / дд / гггг" в JavaScript?
dilipkumar1007
1
@Adrian Lynch Современный вариант JavaScript - это здорово! Спасибо.
Александр Рибейро
134

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

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );
epascarello
источник
8
Ревизия, которая также принимает, /- это разделитель и год, состоящий из 2 цифр (или любого числа больше 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Изаки
1
Почему это должен быть выбранный ответ @AdemirNuno? Зачем использовать RegEx для строки в известном формате? Вы не ищете шаблон, вы знаете, что первое число - это день, второе - месяц, а третье - год. RegEx - неподходящий инструмент для работы в этом случае.
Адриан Линч
Редакция, в которой используются нецифровые разделители, даты без new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") );
начальных
это так практичный парень, спасибо. мой формат даты приходит со временем, поэтому я перекодирую его как: 'new Date ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' это правильно?
Камуран Сёнечек
@NeerajSingh Как конвертировать "Месяц дд, гггг" в "MM / дд / гггг" в JavaScript?
dilipkumar1007
15

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

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

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

Джо
источник
Также в оригинальном вопросе указано «дд-мм-гггг», а не «мм-дд-гггг», так что это все-таки неправильно (но только просто).
Фил М Джонс
@epascarello Как конвертировать "Месяц дд, гггг" в "MM / дд / гггг" в JavaScript?
dilipkumar1007
1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Руи Нуньес
7

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

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)
мака
источник
1
момент (от "ДД-ММ-ГГГГ"). toDate ()
Лапенков Владимир
6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
Саад Имран.
источник
3
Вы получаете Date.parseDate?
kasdega
@kasdega Извините, я думал о $ .datepicker.parseDate, исправил это сейчас :)
Саад Имран.
Вы должны использовать $.datepicker.parseDate("dd-mm-yy", from);для правильного разбора даты, например 24-01-2017, документацию chek datepicker
Андреа Мауро
4

Вы также можете написать дату в скобках 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)
Узник ноль
источник
@AmitSengar Как конвертировать "Месяц дд, гггг" в "MM / дд / гггг" в JavaScript?
dilipkumar1007
3

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

Диодей - Джеймс Макфарлейн
источник
1
Откуда вы взяли эту parseDateфункцию? Это нативная функция JavaScript?
Джозеф Силбер
извините, как мне это реализовать? также мне нужен формат как дд-мм-гг
user559142
parseDate - это встроенная функция JS. Для получения дополнительной информации см .: xaprb.com/articles/javascript-date-parsing-demo.html
Диодей - Джеймс Макфарлейн
1
@ Диодей ... неужели он родной? почему фф и хром выкидывают ошибки?
epascarello
2
@Diodeus даже с последним редактированием это не совсем у меня работает (по крайней мере, с Chrome). Устанавливает дату '2011-01-03'и время UTC 00:00:00. Так что, если часовой пояс пользователя меньше UTC, то на самом деле это будет днем ​​раньше.
Майк
3

В моем случае

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 () для работы с миллисекундами.

Argene Santoni
источник
3

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

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's all gone bad");
} else {
  // Do something with your valid date here
}
Джеймс Хиббард
источник
1

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

Baz1nga
источник
0

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

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)
    );
}
ChaosPandion
источник
Производит не тот месяц! Месяцы начинаются с нуля, а не с одного. Так что, если бы вы сделали Ян, ваш бы сказал февраль
epascarello
1
@epascarello - Забыл, как хромает Date API.
ChaosPandion
@ChaosPandion: как конвертировать myDate = '20 / 06/17 'в формат '20 / 6/2017 00:00:00' в javascript?
Ганшям Лахани
-1
new Date().toLocaleDateString();

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

Нихил Сенгар
источник
Вы имеете в виду передачу строки даты внутри конструктора Date, как, new Date('30/12/2018').toLocaleDateString()?? Это возвращает
неверную