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


184

Я намагаюся перетворити рядок у форматі 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);

Це через символ "-"? Як я можу це подолати?


Це трапляється з усіма датами чи однією зокрема?
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
побили мене до цього ... але я все ще використовую DateJs. Це не зовсім правильно через помилку в огорожі. місяць 0-11, тому потрібно відняти 1. f = нова дата (від [2], від [1] -1, від [0]);
kasdega

12
Вибрана відповідь з помилкою, яка видає неправильні дати. Дивовижно!
epascarello

3
Будьте здорові @kasdega - редагував це ... деякий час тому!
Адріан Лінч

@AdrianLynch Як перетворити "Month dd, yyyy" у "MM / dd / yyyy" у JavaScript?
dilipkumar1007

1
@Adrian Lynch Сучасний варіант JavaScript прекрасний! Дякую.
Олександр Рібейро

134

Приклад регулярного вираження:

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

8
Ревізія, яка також бере /розмежувач, і рік, що складається з двох цифр (або будь-яка кількість, більша за 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")); ' це право?
Kamuran Sönecek

@NeerajSingh Як перетворити "Month dd, yyyy" в "MM / dd / yyyy" у 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]);

Зіставте цифри та переупорядкуйте їх


Також в оригінальному запитанні було вказано "dd-mm-yyyy", а не "mm-dd-yyyy", тому це все-таки неправильно (але тільки просто).
Phil M Jones

@epascarello Як перетворити "Month dd, yyyy" в "MM / dd / yyyy" у JavaScript?
dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes


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 документацію для вибору дати на api.jqueryui.com/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 Як перетворити "Month dd, yyyy" в "MM / dd / yyyy" у JavaScript?
dilipkumar1007

3

Використовуйте цей формат: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
Звідки ви взяли цю parseDateфункцію? Це рідна функція javascript?
Джозеф Сільбер

Вибачте, як я це реалізую? також мені потрібен формат як dd-mm-yy
user559142

parseDate - це нативна функція JS. Для отримання додаткової інформації дивіться: xaprb.com/articles/javascript-date-parsing-demo.html
Діод - Джеймс Макфарлейн

1
@Diodeus ... справді це рідне? як приходять помилки кидання FF та хрому?
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

Ви можете використовувати 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)
    );
}

Виробляє неправильний місяць! Місяці починаються з нуля, а не один. Отже, якби ти зробив Яна, твій би сказав: лютий
epascarello

1
@epascarello - Забув, наскільки кульгавий API Date.
ChaosPandion

@ChaosPandion: як перетворити myDate = '20 / 06/17 'у формат '20 / 6/2017 00:00:00' у JavaScript?
Ghanshyam Lakhani

-1
new Date().toLocaleDateString();

просто, просто перенесіть свою дату на js Date Object


Ви маєте на увазі передачу рядка дати всередині конструктора Date, наприклад, new Date('30/12/2018').toLocaleDateString()?? Це повертає недійсну дату
Ms.Tamil
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.