2009-01-24 4 views
182

Как преобразовать строку в объект времени даты в javascript, указав строку формата?Как преобразовать строку в datetime со спецификацией формата в 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 on. –

+0

Функция Date.parse анализирует строку даты, которая находится в формате «mm/dd/yyyy». Преобразуйте строку в формат «mm/dd/yyyy» перед применением Parse. –

+0

Почему бы не указать дату в нужном формате? Я делаю это как новую дату ('2012 11 25 18:00:00'); и это работает! – foxybagga

ответ

88

Я думаю, что это может помочь вам: http://www.mattkruse.com/javascript/date/

Там в getDateFromFormat() функция, которую вы можете настроить немного, чтобы решить вашу проблему.

Update: есть обновленная версия образцов, доступных на javascripttoolbox.com

+5

'TypeError: Object Date не имеет метода 'getDateFromFormat'' –

+4

Метод getDateFromFormat доступен с документом по ссылке выше. Источник доступен здесь: http://www.mattkruse.com/javascript/date/source.html –

+1

+1, хорошая библиотека..pure javascript ... это фантастика. спасибо –

81

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

+1

Date.parse - лучшее решение! Он разбирает почти все! +1 – ianaz

+5

@ianaz: ПОЧТИ все, что используется в Америке, но отсутствие формата, используемого большой частью Европы, слишком велико «почти». Но новая дата является хорошей основой для пользовательских функций. –

+0

новая дата (dateString) отлично работает для меня, Date.parse() вместо этого преобразуется в миллисекунды и поэтому возвращает число, а не тип даты. – drochora

3

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

Если это не так, вам нужно найти что-то, чтобы свести их на две части. Ваш пример довольно простой (чисто цифры), поэтому прикосновение REGEX (или даже string.split() - может быть быстрее) в паре с некоторым parseInt() позволит вам быстро сделать дату.

14

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

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

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

+3

«придется» относительный. Конечно, вы можете создать свою собственную реализацию. :) – Tomalak

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

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

+0

Откат, который редактируется, хотя он очень полезен, его следует добавить в виде комментария или отдельного ответа. –

+0

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

+0

И вообще, если вам не нравится мое редактирование, это нормально, но разверните свой ответ - «Только для получения обновленного ответа здесь» является наполнителем, и в нем отсутствуют некоторые детали. Этот вопрос получает [некоторое внимание] (http://meta.stackexchange.com/questions/145301/what-can-be-done-with-a-blatantly-wrong-answer-to-a-popular-question) в момент, кстати, по этой причине у вас вдруг получилось 5 голосов. – Kobi

55

@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) в соответствии с вашими потребностями.

Edit: Может быть немного более понятным в использовании 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); 

Но во всей честности в эти дни я хватаюсь за что-то вроде Moment

+17

@ bažmegakapa вместо того, чтобы плакать, возможно, вы отредактировали ответ и добавили «var» самостоятельно? – OrganicPanda

+2

Должен признаться, что ты прав. Btw, downvote удален. – kapa

+0

Почему вы используете флаг '/ g', только для того, чтобы впоследствии установить' lastIndex' в '0'? Просто не используйте глобальное соответствие. – Ryan

0

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

+0

FYI, From RFC 822 (страница: 25. Частично очищено, чтобы соответствовать длине текста для комментариев): 13 августа 1982 г. - 25 - RFC# 822 5. СПЕЦИФИКАЦИЯ ДАТА И ВРЕМЕНИ 5.1.SYNTAX дата-время = [день ","] дата времени; dd mm yy hh: mm: ss zzz day = "Mon"/"Tue"/"Wed"/"Thu"/"Fri"/"Sat"/"Sun" date = 1 * 2DIGIT month 2DIGIT; день месяц год, например. 20 июня 82 month = "Jan"/"Feb"/"Mar"/"Apr"/"May"/"Jun"/"Jul"/"Aug"/"Sep"/"Oct"/"Nov"/" «Дек» –

2

Просто чтобы дать 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) 

Я надеюсь, что кто-то помогает.

+0

Ссылки сейчас мертвы! –

+0

Ну ... быстрый архив.org показал: https://bitbucket.org/mazzarelli/js-date/downloads/ - это URL проекта. –

12

Отъезд Moment.js. Это современная и мощная библиотека, которая компенсирует жалкие функции даты (или их отсутствие).

+3

Я не спустил вниз, но, возможно, было бы хорошо узнать, какая именно функция в Moment.js даст желаемое поведение (для нас, ленивых людей, которые уже используют Moment.js, но не знают, какую функцию использовать). – Matt

+0

Локализация выглядит многообещающей, выберите любой центрально-европейский язык для точечного формата. Однако я не тестировал его, и полный формат даты и времени не был в примерах, которые я видел. –

+0

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

3

Внешняя библиотека является излишним для разбора одной или двух дат, поэтому я сделал свою собственную функцию, используя Oli's и Christoph's решения. Здесь, в Центральной Европе, мы редко используем все, кроме формата 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])); 
    } 
} 
0

Moment.js будет справиться с этим:

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

В то время как момент.js велик, существует множество вариантов использования, где вам нужно просто использовать собственный Javascript. Мой текущий прецедент - это функция Map в CouchDB –

0
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 
Смежные вопросы