Coldfusion 2021 Значение даты, переданное функции даты createDateTime, не указано или недействительно. Укажите допустимую дату в функции createDateTime.

      <cfscript>
    SetTimeZone("Asia/Karachi"); //same as our windows server timezone
</cfscript>

<cfoutput> 
  <cfset mydate = 'June 01, 2008'> 
  <cfset JobStartDate=CreateODBCDateTime(mydate)>
  #JobStartDate#
</cfoutput>

Ошибка: значение даты, переданное функции даты createDateTime, не указано или недействительно. Укажите допустимую дату в функции createDateTime.

Я использую ColdFusion 2021 (обновление 4) на сервере Windows. В разделе сведений о JVM локаль Java по умолчанию — en_US.

Ошибка может воспроизводиться на: cffiddle.org

Будет отлично работать с другими датами, например, 01 июля 2008 г. (хорошо), 15 мая 2009 г. (хорошо) и т. д. Но показывает ошибку с 01 июня 2008 г. (ошибка) и 07 апреля 2002 г. (ошибка). Не уверен, что могут быть другие даты.

Дополнительное примечание: может ли эта проблема быть связана с переходом на летнее время в Пакистане?

Летнее возрождение

В 2008 году Пакистан впервые с 2002 года перешел на летнее время для решения своего энергетического кризиса. В полночь с 31 мая на 1 июня 2008 года часы перевели часы на один час вперед (в формате UTC+6). Необходимость перехода на летнее время в разгар летнего сезона в Пакистане возникла в связи с борьбой страны за примерно 4000 мегаватт электроэнергии. дефицит. (ссылка) [https://www.timeanddate.com/news/time/pakistan-extends-dst-2008.html]

Любая помощь будет принята с благодарностью. Спасибо

2 ответа

Боюсь, принятый (первоначально ~) ответ на этот вопрос неверен. Проблема полностью связана с проблемой летнего времени, упомянутой в оригинальном плакате.

Исходный код таков:

      <cfset mydate = 'June 01, 2008'> 
<cfset JobStartDate=CreateODBCDateTime(mydate)>

Как уже упоминалось, CreateODBCDateTimeожидает объект даты/времени, а не строку, поэтому первое, что нужно сделать CF, это преобразовать 'June 01, 2008'на дату/время, поэтому эквивалент этого:

      <cfset mydate = createDateTime(2008,6,1,0,0,0)>

Я добавил туда часы, минуты и секунды, потому что они необходимы для создания объекта даты/ времени . Вы не указали временную часть, поэтому CF должен принять там нули.

И угадайте, что? 1 июня 2008 г. по правилам перехода на летнее время в Пакистане не существует такой вещи, как 00:00:00. Ровно в полночь время рванулось вперед, 01:00:00. Отсюда ошибка:

      Date value passed to date function createDateTime is unspecified or invalid

Он точно говорит вам, в чем проблема. Это всегда будет получаться при попытке использовать время, которое не существует из-за капризов перехода на летнее время. Это точно такая же ситуация, как если бы кто-то попытался указать часть даты как «32 февраля» или что-то более явно недопустимое.

Вы получите ту же ошибку на 2009-04-15по той же причине: именно тогда в том году началось летнее время.

Это демонстрирует, почему серверы всегда должны быть настроены на UTC. Очень редко бывают "неожиданные" разрывы во времени (несмотря на странную коррекционную дополнительную секунду), поэтому таких проблем просто не возникает. Если вы используете UTC, а затем настраиваете часовой пояс для отображения для людей, когда это необходимо, CF всегда будет делать это правильно.


Еще один момент. Говорить, что код работал нормально в более старых версиях CF, неверно (это появилось в комментариях к предыдущему ответу). SetTimeZoneбыл добавлен в CFML только для ColdFusion для CF2021, а код в ошибках вопроса — в более ранних версиях. Таким образом, что бы вы ни испытывали или не тестировали в более старых версиях CF, это не было проблемой.

Может ли эта проблема быть связана с переходом на летнее время в Пакистане?

Нет, эта проблема не связана с переходом на летнее время в Пакистане.

Обновление: как правильно упомянул Адам Камарон...

Проблема полностью связана с проблемой летнего времени, упомянутой в оригинальном плакате.

Мои первоначальные выводы оказались неверными. Пожалуйста, прочитайте очень интересный ответ Адама Кэмерона на этот вопрос для дальнейшего глубокого объяснения. Его ответ должен быть принятым.

Я буду держать свой пост с ответом активным для дальнейшего использования, потому что может быть полезно дать лучший обзор аналогичных проблем, связанных с объектами dateTime в CFML.

============================

Оригинальный ответ:

В соответствии с документацией cfml о CreateODBCDateTime() вам необходимо передать объект dateTime в качестве аргумента CreateODBCDateTime(). Ваша переменная mydate = 'June 01, 2008'это просто строка, представляющая дату, но это не объект dateTime.

01 июля 2008 г. (хорошо), 15 мая 2009 г. (хорошо) и т. д. Но показывает ошибку с 01 июня 2008 г. (ошибка) и 07 апреля 2002 г. (ошибка)

Движок cfml попытается каким-то образом обработать отправленную строку и привести ее к правильному типу данных, но это может сработать, а может и не сработать: это просто официально не поддерживается, поэтому я бы не стал этого делать.

Чтобы создать dateTimeObject, вам нужно сначала проанализировать эту строку в dateObject, например, используя lsParseDateTime(), и, как правильно прокомментировал @sos, если вы используете разные локали, лучше всегда передавать правильную локаль, которую содержимое строки представляет как атрибут :

      <cfoutput> 
  <cfset mydate = 'June 01, 2008'> 
  <cfset JobStartDate=CreateODBCDateTime( lsParseDateTime( mydate, "en_US" ))>
  #JobStartDate#
</cfoutput>

Если ваши данные dateTime подходят, альтернативой будет создание объекта dateTimeObject с нуля с помощью функции createDateTime(), например:

      <cfoutput> 
  <cfset mydate = createDateTime(2008,5,1,0,0,0)> 
  <cfset JobStartDate=CreateODBCDateTime( mydate )>
  #JobStartDate#
</cfoutput>

Что касается временных сдвигов по всему миру, это зависит от того, как вы получаете и сохраняете свои данные о времени и кому в мире вы их доставляете. В мировых средах я обычно сохранял даты в формате UTC и выводил их соответствующим образом с помощью функций TimeZone.

Дополнительное примечание... потому что это обычно неправильно понимают, поэтому я размещаю его здесь только для потомков: "locales" адаптирует строку к типичным читаемым (преобразованным) строкам, поскольку они обычно читаются и идентифицируются соответствующими культурами, но они не Не меняйте часовые пояса.

Чтобы понять, что еще немного, могу горячо порекомендовать посмотреть это видео про timeZones от Lucee. Это не из ColdFusion, но многое объясняет об интернационализации времени и часовых поясах в CFML, а также о некоторых подводных камнях.

Другие вопросы по тегам