Copy link to clipboard
Copied
I believe I found a bug in CF11 with DateTime comparisons when dealing with UTC converted values going through serializeJSON then deserializeJSON. I did modify the code to not include the local2utc conversion and that seemed to produce correct results. Can someone please confirm:
<cfscript>
variables.dttm = createDateTime(2016,04,03,17,53,0);
variables.dttmutc = dateConvert('local2utc',variables.dttm);
variables.base = {};
variables.base.dttmutc_min = dateConvert('local2utc',dateAdd('h',-1,variables.dttm));
variables.base.dttmutc_max = dateConvert('local2utc',dateAdd('n',1,variables.dttm));
variables.viajson = deserializeJSON(serializeJSON(variables.base));
variables.viajson.dttmutc_min = parseDateTime(variables.viajson.dttmutc_min); // to me this parsing should not be required
variables.viajson.dttmutc_max = parseDateTime(variables.viajson.dttmutc_max); // same
</cfscript>
<cfoutput>
<h1>base</h1>
dttm = #variables.dttm#<br />
dttmutc = #variables.dttmutc#<br />
dttmutc_min = #variables.base.dttmutc_min#<br />
dttmutc_max = #variables.base.dttmutc_max#<br />
<br />
dttmutc GT dttmutc_min = #variables.dttmutc GT variables.base.dttmutc_min#<br />
dttmutc LT dttmutc_max = #variables.dttmutc LT variables.base.dttmutc_max#<br />
<h1>via json</h1>
dttm = #variables.dttm#<br />
dttmutc = #variables.dttmutc#<br />
dttmutc_min = #variables.viajson.dttmutc_min#<br />
dttmutc_max = #variables.viajson.dttmutc_max#<br />
<br />
dttmutc GT dttmutc_min = #variables.dttmutc GT variables.viajson.dttmutc_min# (should be YES)<br /> // this is the failing comparison
dttmutc LT dttmutc_max = #variables.dttmutc LT variables.viajson.dttmutc_max#<br />
</cfoutput>
My results are as follows:
dttm = {ts '2016-04-03 17:53:00'}
dttmutc = {ts '2016-04-04 00:53:00'}
dttmutc_min = {ts '2016-04-03 23:53:00'}
dttmutc_max = {ts '2016-04-04 00:54:00'}
dttmutc GT dttmutc_min = YES
dttmutc LT dttmutc_max = YES
dttm = {ts '2016-04-03 17:53:00'}
dttmutc = {ts '2016-04-04 00:53:00'}
dttmutc_min = {ts '2016-04-03 23:53:00'}
dttmutc_max = {ts '2016-04-04 00:54:00'}
dttmutc GT dttmutc_min = NO (should be YES)
dttmutc LT dttmutc_max = YES
BTW, I'm not sure if it matters but my time zone is Pacific Daylight Time (PDT).
Have something to add?