Проблема с форматом даты Coldfusion 10

Я использую функцию DateFormat для преобразования дат в этот формат: yyyy-mm-dd. Это исходный формат даты: dd-mm-yyyy. Ниже приведен фрагмент кода:

<cfset newdate = #DateFormat(Trim(mydate), "yyyy-mm-dd")# />

Проблема в том, что я получаю разные результаты для разных дат. Например:

  • Если моя исходная дата: 15-05-2013 (дд-мм-гггг)
  • Результат: 2013-05-15 (гггг-мм-дд)

Однако, если я изменю ввод и:

  • Исходная дата: 01-05-2013 (дд-мм-гггг).
  • Результат: 2013-01-05 (гггг-дд-мм)

Любая помощь или руководство относительно того, что не так, будут высоко оценены.


person raul prakash    schedule 15.05.2013    source источник


Ответы (2)


Я не согласен с другим ответом. Настоящая причина проблемы заключается в том, что DateFormat не предназначен для обработки строк дат, отличных от США.

Стандартные функции даты CF всегда используют правила синтаксического анализа даты США. Это означает, что когда вы передаете неоднозначную строку даты, например 01-05-2013, она анализируется в соответствии с США Английские соглашения о датах. В этом случае сначала месяц, т.е. "мм-дд-гггг". Так что результатом всегда будет 5 января, а не 1 мая.

В некоторых случаях вам повезет. Со строкой 15-05-2013, очевидно, нет 15-го месяца, поэтому CF/java должен автоматически поменять местами месяц и день, а не выдавать ошибку. Вот почему кажется правильно обрабатывать некоторые строки даты dd-mm-yyyy, но не другие.

Если вы хотите анализировать строки дат, отличные от США, вместо этого следует использовать функции даты LS (локальные настройки). Однако, согласно документам, тире, т.е. "-", не являются стандартным разделителем даты в большинстве неамериканских языков: только в голландском и португальском (стандарт). Таким образом, вам нужно либо изменить разделитель, либо использовать одну из этих двух локалей при разборе даты:

        lsDateFormat( myDate, "yyyy-mm-dd", "pt_PT")

Примечание:

Кроме того, DateFormat действительно ожидает дату object. Однако, как и большинство функций в CF, он достаточно гибок, чтобы принимать строку даты. Это позволяет вам использовать его как ленивый ярлык для преобразования даты string => date object =>, а затем обратно в (форматированную) строку даты снова. Использование объектов даты предпочтительнее (и вам действительно следует проверять строки даты), но это совсем другой разговор...

person Leigh    schedule 15.05.2013

Проблема в том, что DateFormat ожидает объект даты и возвращает строку.

Вы передаете ему строку, а не дату. Что вы хотите сделать, так это сначала превратить вашу строку (01-05-2013 и т. д.) в объект даты.

Для этого я бы рекомендовал использовать либо ParseDateTime или LSParseDateTime и/или LSDateFormat.

e.g.

<cfset originalDateString = "01-05-2013">

<!--- turn that into a Date --->
<cfset dateObject = ParseDateTime(originalDateString)>

<cfset newdateString = DateFormat(dateObject, "yyyy-mm-dd")>

В качестве альтернативы, если вы знаете, что ваша строка всегда имеет формат дд-мм-гггг, вы можете самостоятельно проанализировать строку, например. рассматривать его как список, разделенный дефисами.

<cfset dd = listFirst(originalDateString, "-")>
<cfset mm = listGetAt(originalDateString, 2, "-")>
<cfset yy = listLast(originalDateString, "-")>
person duncan    schedule 15.05.2013
comment
Нет, на самом деле dateFormat тоже с радостью примет строку даты. Настоящая проблема заключается в том, что стандартные функции даты ожидают строку даты на английском языке в США и анализируются в соответствии с соглашениями о дате на английском языке в США, т.е. первым месяцем. - person Leigh; 15.05.2013