Проверки ColdFusion UTC TIME LTE по сравнению со временем, отличным от UTC

Я потерялся, я могу проверить время, отличное от UTC, и все работает. Но при конвертации в UTC Times CFIF не работает

НЕ UTC {ts '2019-11-10 14:59:46'} LTE {ts '2019-11-10 14:00:00'}

UTC, если {ts '2019-11-10 21:59:46'} LTE {ts '2019-11-10 21:00:00'}

Я потерялся... Не могу понять.

<cfset timenow = #Now()#>

<cfset utimenow = dateConvert("Local2UTC", timenow)>

<cfset admintime = #DateAdd("h", -1, chk.stime)#>
<cfset uadmintime = #DateAdd("h", -1, chk.utcact)#>

Время chk.stime и chk.utc правильное. в основном это занимает час времени для отмены окна.

Это созданные метки времени.

NON UTC {ts '2019-11-10 14:59:46'} LTE {ts '2019-11-10 14:00:00'}

Штампы NonUTC — это штампы времени без преобразования UTC.

UTC if {ts '2019-11-10 21:59:46'} LTE {ts '2019-11-10 21:00:00'} 

Марки вне UTC

<cfif timenow LTE admintime>
This one works fine...
 NON UTC {ts '2019-11-10 14:59:46'} LTE {ts '2019-11-10 14:00:00'}
 Then allow cancel
<cfelse>
This cfelse is activated properly and Can't Cancel.
 Can't Cancel
</cfif>

UTC Stamps
<cfif utimenow LTE uadmintime>
This one does not work
 UTC if {ts '2019-11-10 21:59:46'} LTE {ts '2019-11-10 21:00:00'}
 Then allow cancel
 This UTC Time does not activate properly and allows the cancel.
 Executes/Activates inside the cfif - it should not
 <cfelse>
 Can't Cancel
</cfif>

Я также пытался конвертировать, чтобы быть уверенным в ODBCTime.

<cfset uadmintime = createODBCDateTime(uadmintime)>

В итоге мне пришлось воссоздать время и сравнить этот формат. Теперь он работает как с <cfif timenow LTE admintime>, так и с DateCompare, как показано ниже. Должно быть, это проблема форматирования, потому что не нравится форматирование {ts '2019-11-10 14:59:46'} LTE {ts '2019-11-10 14:00:00'}.

<cfset nctime = '#dateformat(uadmintime, "dd-MM-yyyy")# #timeformat(uadmintime, "hh:mm:ss")#'>
<cfset nutctime = '#dateformat(utimenow, "dd-MM-yyyy")# #timeformat(utimenow, "hh:mm:ss")#'>

person Merle_the_Pearl    schedule 10.11.2019    source источник
comment
Ваш вопрос не ясен. Вы ссылаетесь на переменные, не указывая их значения. Вы также показываете некоторый код if/else, но не говорите, выполняется ли блок if или else.   -  person Dan Bracuk    schedule 11.11.2019
comment
Еще немного отредактировал. Время не в формате UTC выполняется правильно, время в формате UTC — нет.   -  person Merle_the_Pearl    schedule 11.11.2019


Ответы (1)


ColdFusion является свободно типизированным языком и может хранить значения даты/времени в различных типах данных. Стандартные сравнения, такие как eq, lte и т. д., сравнивают переменные разных типов на основе неизвестных и меняющихся правил, поэтому могут иметь неожиданные результаты, если CF решит преобразовать данные в другой тип. Бывают случаи, когда вы ожидаете, что переменная будет объектом даты/времени, когда на самом деле это строка, которая проходит проверку на дату. Различные версии CF, Lucee и т. д. могут действовать по-разному или также зависеть от фактических задействованных значений.

Я рекомендую всегда использовать dateCompare() при сравнении дат...

https://cfdocs.org/datecompare

<cfif utimenow LTE uadmintime>
    ...
</cfif>

становится

<cfif dateCompare(utimenow, uadmintime) lte 0>
    ...
</cfif>

Пример кода:

https://cffiddle.org/app/file?filepath=e3d24147-8a25-44ff-a98d-5b1e686cd619/d6115113-eead-4214-bc94-13eb7f0456f5/efad9206-b082-4940-bf5d-f4c5001mae2ec.cf

person Dan Roberts    schedule 11.11.2019
comment
Не работает: NEW TRY : DATECOMPARE: {ts '2019-11-11 13:55:29'} vs {ts '2019-11-11 13:30:00'} : выполняет cfif, когда он должен быть неправильный - person Merle_the_Pearl; 11.11.2019
comment
@Merle_the_Pearl у вас должна быть дата / время в правильном порядке, чтобы сравнение работало, и вы должны проверить результат. Даты, которые вы только что перечислили, правильно привели бы к тому, что первое число было бы больше, поэтому значение 1 выводится из dateCompare(). (исправлена ​​опечатка в комментарии) - person Dan Roberts; 11.11.2019
comment
Что-то не так: если я перейду на ‹cfif dateCompare(utimenow, uadmintime) eq 1› {ts '2019-11-11 14:12:24'} LTE {ts '2019-11-11 14:30:00 '} не выполняется должным образом, но {ts '2019-11-11 14:14:41'} LTE {ts '2019-11-11 13:30:00'} работает. - person Merle_the_Pearl; 11.11.2019
comment
@Merle_the_Pearl Вам нужно посмотреть на это более внимательно. Эквивалент LTE является результатом -1 из dateCompare(). Редактировать: на самом деле LTE будет dateCompare(...) LTE 0, если быть более точным. - person Dan Roberts; 11.11.2019
comment
Другими словами... измените все ваши date1 LTE date2 на dateCompare(date1, date2) LTE 0. - person Dan Roberts; 11.11.2019
comment
Все еще не выполняется должным образом: использование ‹cfif dateCompare(utimenow, uadmintime) lte 0› DATECOMPARE: {ts '2019-11-11 15:02:25'} LTE {ts '2019-11-11 14:30:00'} ?? все еще не выполняется должным образом - person Merle_the_Pearl; 11.11.2019
comment
@Merle_the_Pearl, каков ваш ожидаемый результат кода в вашем последнем комментарии? - person Dan Roberts; 11.11.2019
comment
cffiddle.org/app/ - person Dan Roberts; 11.11.2019
comment
Я думаю, что это форматирование проблемы времени, и ему не нравится сравнивать {ts '2019 etc}, поэтому мне нужно отформатировать время во что-то работоспособное, я думаю. - person Merle_the_Pearl; 11.11.2019
comment
Было форматирование того, как происходило сравнение времени: ‹cfset nctime = '#dateformat(canceltime, dd-MM-yyyy)# #timeformat(canceltime, hh:mm:ss)#'› работал. - person Merle_the_Pearl; 11.11.2019