2013-11-23 2 views
3

Я пытаюсь разобрать две строки даты в объекты даты. Код работает для одной строки, но порождает ошибку «неверное время» для другого. Единственное различие заключается в том, что у него есть «Сб», в начале! Пожалуйста, скажите мне, почему это происходит и как я могу это решить!ColdFusion: Дата ошибки, которая не имеет дня недели?

<cfset datetimetest1 = "23 Nov 2013 00:53:12 +0000"> 
    <!---^This throws an error (when you try to pass it). Error says 'invalid date time' ---> 

    <cfset datetimetest2 = "Sat, 23 Nov 2013 00:53:12 +0000"> 
    <!---^This works when it is parsed ---> 

    <cfoutput> 
    #parsedatetime(datetimetest1)# #parsedatetime(datetimetest2)# 
    </cfoutput> 
+0

Как вы получать эту информацию в первую очередь? Форма представления? –

ответ

0

Update:

По CF10 +, вы можете использовать строку пользовательского формата для указания функции о том, как анализировать и преобразовывать входные данные в даты и времени объекта:

// Custom format string 
dateObject = parseDateTime("23 Nov 2013 00:53:12 +0000" 
          , "dd MMM yyyy HH:mm:ss zzz"); 

Это одна из областей, в которой гибкость и простота использования CF могут быть недостатком ИМО. К сожалению, parseDateTime не позволяет указать формат входной строки, поэтому CF должен сделать много угадывания, чтобы «автоматически» преобразовать вашу строку в дату объект.

В одном из инструментов CF используется класс java SimpleDateFormat, который использует шаблоны для синтаксического анализа или преобразования строк в Dates. Я понимаю, что CF поддерживает список стандартных шаблонов даты/времени (в соответствии с соглашениями о датах в США). Ваша первая строка не должна соответствовать ни одному из этих шаблонов. Отсюда и ошибка.

Если дата строки всегда в UTC, вы могли бы просто использовать функции списка опустить смещение часового пояса т.е. +0000, а затем разобрать строку как обычно:

<cfscript> 
    origString = "23 Nov 2013 00:53:12 +0000"; 
    dateString = listFirst(origString, "+"); 
    WriteDump(parseDateTime(dateString)); 
</cfscript> 

Или вы могли бы DIY используя SimpleDateFormat и соответствующий шаблон dd MMM yyyy HH:mm:ss Z (см. Date and Time Patterns). Сразу отметим, возвращаемые даты по местному времени, так что вам, возможно, придется использовать DateConvert если вы хотите UTC раза:

// get formatter based on default locale 
formatter = createObject("java", "java.text.SimpleDateFormat").init(); 
// set up pattern for input date string 
formatter.applyPattern("dd MMM yyyy HH:mm:ss Z"); 
// parse it into a date object 
dateObject = formatter.parse("23 Nov 2013 00:53:12 +0000"); 
// display result in local and UTC time 
WriteDump("local="& dateObject); 
WriteDump("utc="& DateConvert("local2UTC", dateObject)); 
0

Я идентифицированный RSS дату, которые используются из следующих источников и протестировали их против isDate(), DateFormat() и LSDateFormat(). ColdFusion 10,286680 смог проанализировать только 65% дат (38 из 58).

http://rssdateformats.tumblr.com/

https://github.com/mjibson/goread/blob/0387db10bd9fd9ccd90d557fa30b6e494efa577a/goapp/utils.go#L129

Вот тестовый сценарий, который я написал:

https://gist.github.com/JamoCA/7617349

Я искал библиотеку дата синтаксического анализатора Java и недавно нашел Natty и StringToTime, но еще не использовали. (Ни ресурс содержит загружаемый файл JAR.):

http://natty.joestelmach.com/

https://github.com/collegeman/stringtotime

Смежные вопросы