Як я можу конвертувати рядок у дату часу із специфікацією формату в JavaScript?


208

Як я можу перетворити рядок у об’єкт часу дати у JavaScript, вказавши рядок формату?

Я шукаю щось на зразок:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");

2
Точки та дефіси BTW можуть вийти з ладу як роздільники дат, риски в порядку, так що (в межах моїх тестів) Javascript прийме "2011/08/22 10:30:00", але ще не (незважаючи на ISO 8601) "2011-09 -02 15:58:40 "яка - стверджується - підтримується в Javascript 1.8.5 на.
Дейв Еверітт

Функція Date.parse аналізує рядок дати у форматі "mm / dd / yyyy". Будь ласка, перетворіть рядок у формат "mm / dd / yyyy" перед застосуванням Parse.

Чому б не надати дату у потрібному форматі? Я роблю це як нова дата ('2012 11 25 18:00:00'); і це працює!
foxybagga

Відповіді:


88

Я думаю, що це може вам допомогти: http://www.mattkruse.com/javascript/date/

Існує getDateFromFormat()функція, яку можна трохи налаштувати, щоб вирішити свою проблему.

Оновлення: оновлена ​​версія зразків доступна на javascripttoolbox.com


5
TypeError: Object Date has no method 'getDateFromFormat'
Дерек 朕 會 功夫

6
Метод getDateFromFormat доступний разом з doc, за посиланням вище. Джерело доступне тут: mattkruse.com/javascript/date/source.html
Рафаель Мюллер

1
+1, хороша бібліотека ... чистий javascript ... це фантастично. дякую
Сурендра Джавалі

7
Обидві ланки мертві
Ситем

1
Якщо можете, оновіть посилання. Це вже не допомагає.
Tallerlei

98

Використовуйте, якщо ваша струна сумісна з . Якщо ваш формат є несумісним (я думаю, що він є), вам слід самостійно проаналізувати рядок (це має бути легко за допомогою регулярних виразів) та створити новий об'єкт дати з явними значеннями для року, місяця, дати, години, хвилини та секунди.new Date(dateString)Date.parse()


1
Date.parse - найкраще рішення! Він розбирає майже все! +1
ianaz

7
@ianaz: ВЖЕМО все, що використовується в Америці, але відсутній формат, який використовується великою частиною Європи, занадто великий "майже". Але нова дата - хороша основа для користувацьких функцій.
Павло Вікторович

нова дата (dateString) спрацювала нормально для мене, Date.parse () замість цього перетворюється на мілісекунди і тому повертає число, а не тип дати.
Рейган Очора

68

@Christoph Згадує, що використовує регулярний вираз для вирішення проблеми. Ось що я використовую:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Це аж ніяк не інтелігентно, просто налаштуйте регулярний вираз і new Date(blah)відповідно до ваших потреб.

Редагувати: Можливо, трохи зрозуміліше в ES6 за допомогою деструктуризації:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

Але від усієї чесності в ці дні я досягаю чогось, як Момент


19
@ bažmegakapa замість того, щоб плакати, ви могли, можливо, відредагувати відповідь і додати 'var’s yourself?
OrganicPanda

Чому ви використовуєте /gпрапор, лише щоб встановити lastIndexйого 0згодом? Просто не використовуйте глобальну відповідність.
Ри-

1
@minitech Це /gбула неохайна копія / вставлення з існуючого проекту. lastindexбув доданий редактором (для боротьби з \gгадаю?). Я зараз їх видалю. Дякую, що вказали на це.
OrganicPanda

1
дуже приємна відповідь .. дійсно корисна для мене
Jethik

14

Немає складних процедур форматування дати та часу в JavaScript.

Вам доведеться використовувати зовнішню бібліотеку для форматованого виведення дати, "Формат дати JavaScript" від Flagrant Badassery виглядає дуже перспективно.

Для вхідного перетворення вже зроблено кілька пропозицій. :)


3
"повинен" відносний. Звичайно, ви можете створити власну реалізацію. :)
Томалак

13

Перевірте Moment.js . Це сучасна і потужна бібліотека, яка складається з чудових функцій дати (або їх відсутності) у JavaScript.


3
Я не сказав, але, можливо, було б непогано точно знати, яка функція в Moment.js спричинить бажану поведінку (для нас ледачих людей, які вже використовують Moment.js, але не знають, яку саме функцію використовувати) .
Метт

Локалізація виглядає багатообіцяючою, виберіть будь-яку центральну європейську локаль для формату точок. Однак я не перевіряв його, і повний формат дати не є у прикладах, які я бачив.
Павло Вікторович

Я не виступав, але просто хотів сказати, що це повільно. Для робочого столу добре, але для мобільних може бути занадто повільним (залежно від ваших потреб).
gabn88

11

Тільки для оновленої відповіді тут, є хороший js lib на http://www.datejs.com/

Datejs - це бібліотека дат JavaScript з відкритим кодом для розбору, форматування та обробки.


Відредагували цю редакцію, хоча вона дуже корисна, але її слід додати як коментар або окрему відповідь.
Олексій Абріль

Для коментарів все одно було занадто довго, і додавання дублюваної відповіді неправильно. Це питання має понад 155 000 переглядів - давайте дамо цим людям якомога більше інформації! (до речі, в Stack Overflow дуже часто редагувати існуючу відповідь - вам, мабуть, стане гірше, якби я просто скопіював вашу відповідь ...)
Кобі

1
І все одно, якщо вам не подобається моя редакція, це нормально, але, будь ласка, розгорніть свою відповідь - "Просто для оновленої відповіді тут" є наповнювачем, і в ній відсутні деякі деталі. На сьогодні це питання привертає деяку увагу , через що ви раптом отримали 5 голосів.
Кобі

7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}

5

Зовнішня бібліотека - це надмір для розбору однієї чи двох дат, тому я зробив власну функцію, використовуючи рішення Олі та Крістофа . Тут у центральній Європі ми рідко використовуємо будь-який інший, але формат ОП, тому цього повинно вистачити для простих додатків, які використовуються тут.

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}

4

Date.parse() досить розумний, але я не можу гарантувати, що формат буде правильно розбиратися.

Якщо цього не відбувається, вам доведеться знайти щось, щоб з'єднати їх. Ваш приклад досить простий (просто чисто число), тому дотик до REGEX (або навіть string.split()- може бути швидше) в парі з деякими parseInt()дозволить вам швидко побачити побачення.


4
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec

плюс 1 після виклику функції getmonth () здається невірним
Arjunsingh

t.getMonth () + 1 є правильним, оскільки Date.getMonth () повертає значення, засноване на 0.
Jussi Palo

3

Тільки щоб дати мої 5 копійок.

Мій формат дати - dd.mm.yyyy (формат Великобританії), і жоден із перерахованих вище прикладів не працював для мене. Усі парсери розглядали мм як день, а дд - місяць.

Я знайшов цю бібліотеку: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/, і вона працювала, тому що ви можете сказати порядок таких полів:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

Я сподіваюся, що хтось допомагає.


Посилання тепер мертві!

Ну ... швидкий archive.org показав: bitbucket.org/mazzarelli/js-date/downloads - це URL-адреса проекту.
Антон Валк

1

Moment.js впорається з цим:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;

1
Хоча moment.js чудовий, є безліч випадків використання, коли вам потрібно просто використовувати рідний Javascript. Мій поточний приклад використання - це функція Map у CouchDB
Zach Smith

1

Ви можете використовувати для цього бібліотеку moment.js. Я використовую лише для отримання конкретного часу виводу, але ви можете вибрати, який саме формат потрібно вибрати.

Довідка:

1. бібліотека моменту: https://momentjs.com/

2. Спеціальні функції часу та дати: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

і ви можете назвати цей метод на зразок:

this.convertDate('2020-05-01T10:31:18.837Z');

Я сподіваюся, що це допомагає. Насолоджуйтесь кодуванням.


0

Щоб повністю задовольнити рядок перетворення Date.parse у формат dd-mm-YYYY, як зазначено в RFC822, якщо ви використовуєте синтаксичний розбір yyyy-mm-dd, ви можете помилитися.


FYI, From RFC 822 (стор.: 25. Частково очищено, щоб відповідати довжині тексту для коментарів): 13 серпня 1982 - 25 - RFC № 822 5. ДАТА ТА ЧАС СПЕЦИФІКАЦІЯ 5.1. SYNTAX дата-час = [день ","] час дати; dd мм yy hh: mm: ss zzz day = "Пн" / "Вт" / "Ср" / "Чт" / "Пт" / "Сб" / "Сонце" дата = 1 * 2DIGIT місяць 2DIGIT; день місяць рік, наприклад, 20 червня 82 місяць = "січ" / "лют" / "березень" / "квітень" / "травень" / "червень" / "липень" / "серпня" / "вересень" / "жовтень" / " Листопад "/" грудень "
Валентин Раск

0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }

Квірист попросив вказати рядок формату .
Армалі

@Armali Параметр введення типу "/ Дата (1552415400000) /" у
рядковому
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.