Как я могу преобразовать строку в дату и время с указанием формата в JavaScript?

208

Как я могу преобразовать строку в объект даты и времени в JavaScript, указав строку формата?

Я ищу что-то вроде:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
Серхат Озгель
источник
2
Кстати, точки и дефисы могут потерпеть неудачу в качестве разделителей даты, косые черты в порядке, поэтому (в рамках моих тестов) Javascript примет «2011/08/22 10:30:00», но пока (несмотря на ISO 8601) «2011-09 -02 15:58:40 "который, как утверждается, поддерживается в Javascript 1.8.5.
Дэйв Эверитт
Функция Date.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 доступен вместе с документом по ссылке выше. Источник доступен здесь: mattkruse.com/javascript/date/source.html
Рафаэль Мюллер,
1
+1, хорошая библиотека .. чистый javascript ... это фантастика. спасибо
Сурендра Джнавали
7
Обе ссылки мертвы
Sytham
1
Если вы можете, пожалуйста, обновите ссылку. Это больше не помогает.
Таллерлей
98

Используйте, если ваша строка совместима с . Если ваш формат несовместим (я думаю, что это так), вы должны проанализировать строку самостоятельно (это должно быть легко с регулярными выражениями) и создать новый объект Date с явными значениями для года, месяца, даты, часа, минуты и секунды.new Date(dateString)Date.parse()

Christoph
источник
1
Date.parse - лучшее решение! Разбираю практически все! +1
ianaz
7
@ianaz: ПОЧТИ все, что используется в Америке, но пропустить формат, используемый большой частью Европы, слишком много «почти». Но новая дата является хорошей основой для пользовательских функций.
Павел В.
new Date (dateString) работал для меня нормально, Date.parse () вместо этого преобразуется в миллисекунды и возвращает число, а не тип Date.
Рейган
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);

Но, честно говоря, в эти дни я стремлюсь к чему-то вроде Момента

OrganicPanda
источник
19
@ bažmegakapa вместо того, чтобы плакать, вы могли бы, возможно, отредактировать ответ и добавить «сам»?
OrganicPanda
Почему Вы используете /gфлаг, только набор lastIndexдля 0после этого? Просто не используйте глобальное совпадение.
Ry-
1
@minitech Это /gбыла небрежная копия / вставка из существующего проекта. lastindexбыл добавлен редактор (для борьбы с \gя полагаю?). Я удалю их сейчас. Спасибо за указание на это.
OrganicPanda
1
очень хороший ответ .. очень полезный для меня
Jethik
14

В JavaScript нет сложных процедур форматирования даты / времени.

Вам нужно будет использовать внешнюю библиотеку для форматированного вывода даты, «JavaScript Date Format» от Flagrant Badassery выглядит очень многообещающе.

Для преобразования входных данных уже было сделано несколько предложений. :)

Томалак
источник
3
«должен» является относительным. Конечно, вы можете создать свою собственную реализацию. :)
Томалак
13

Проверьте Moment.js . Это современная и мощная библиотека, которая компенсирует ужасные функции Date в JavaScript (или их отсутствие).

Аарон Грей
источник
3
Я не понизил голос, но, возможно, было бы неплохо точно знать, какая функция в Moment.js даст желаемое поведение (для нас, ленивых людей, которые уже используют Moment.js, но не знают, какую функцию использовать) ,
Мэтт
Локализация выглядит многообещающе, выберите любой центральноевропейский язык для точечного формата. Тем не менее, я не проверял это, и полный формат даты и времени не в примерах, которые я видел.
Павел В.
Я не понизил голос, но я просто хотел сказать, что это медленно. Для рабочего стола нормально, но для мобильного может быть слишком медленным (в зависимости от ваших потребностей).
gabn88
11

Просто для обновленного ответа здесь, есть хорошая библиотека js на http://www.datejs.com/

Datejs - это библиотека дат JavaScript с открытым исходным кодом для анализа, форматирования и обработки.

Алексис Абриль
источник
Откатил это редактирование, хотя и очень полезно, его следует добавить как комментарий или отдельный ответ.
Алексис Абриль
В любом случае, это было слишком долго для комментария, и добавление дублированного ответа неверно. Этот вопрос имеет более 155 000 просмотров - давайте дадим этим людям как можно больше информации! (кстати - очень часто в Stack Overflow редактировать существующий ответ - вам, вероятно, будет хуже, если я просто скопирую ваш ответ ...)
Kobi
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

Внешняя библиотека - это излишняя обработка парсинга одной или двух дат, поэтому я создал свою собственную функцию, используя решения Оли и Кристофа . Здесь, в центральной Европе, мы редко используем что-либо, кроме формата OP, поэтому этого должно быть достаточно для простых приложений, используемых здесь.

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()позволит вам быстро назначить дату.

Oli
источник
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
puneet18
источник
плюс 1 после вызова функции getmonth () кажется неправильным
Arjunsingh
t.getMonth () + 1 является правильным, поскольку Date.getMonth () возвращает 0 на основе значения.
Юсси Пало
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.;
Chintsu
источник
1
Несмотря на то, что moment.js великолепен, есть множество вариантов использования, когда вам нужно просто использовать нативный Javascript. Мой текущий вариант использования - это функция Map в CouchDB
Зак Смит,
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');

Я надеюсь, что это помогает. Наслаждайтесь кодированием.

Amit Pandya
источник
0

Чтобы полностью удовлетворить строку преобразования Date.parse в формат dd-mm-YYYY, как указано в RFC822, при использовании анализа yyyy-mm-dd могут произойти ошибки.

Валентин Раск
источник
К вашему сведению, из RFC 822 (стр. 25. Частично очищено, чтобы соответствовать длине текста комментария): 13 августа 1982 г. - 25 - RFC № 822 5. СПЕЦИФИКАЦИЯ ДАТЫ И ВРЕМЕНИ 5.1. SYNTAX date-time = [день ","] время даты; дд мм гг чч: мм: сс zzz день = «пн» / «вт» / «ср» / «чт» / «пт» / «сб» / «вс» дата = 1 * 2DIGIT месяц 2DIGIT; день месяц год, например, 20 июня 82 месяца = "январь" / "февраль" / "март" / "апрель" / "май" / "май" / "июнь" / "июль" / "август" / "сентябрь" / "октябрь" / " Ноя »/« Dec »
Валентин Раск
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;
    }
Абхишек Канрар
источник
Querist попросил указать строку формата .
Armali
@Armali Входной параметр типа "/ Date (1552415400000) /" в строковом формате
Абхишек Канрар