Конвертировать строку 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);

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


Это происходит со всеми датами или с одной в частности?
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") );

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]);
Руи Нуньес


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


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.


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)
    );
}

Производит не тот месяц! Месяцы начинаются с нуля, а не с одного. Так что, если бы вы сделали Ян, ваш бы сказал февраль
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()?? Это возвращает
неверную
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.