如何让 DateCompare() 在 ColdFusion 10 中运行?
How to get DateCompare() to behave in ColdFusion 10?
我在太平洋标准时间 Windows 使用最新更新级别的 CF10。我需要一个 datecompare()
组合 returns 0 但我无法让它每次都表现出来,因为 Adobe 决定 change the behavior of DateConvert()
and DateCompare()
<cfset filePath = getBaseTemplatePath()>
<cfset fileinfo = getFileInfo(filePath)>
<cfset lastModified = fileinfo.lastModified>
<cfset lastModifiedUTC = dateConvert("local2utc", lastModified)>
<cfset lastModifiedUTC2 = dateAdd("s", getTimezoneInfo().UtcTotalOffset, lastModified)>
<cfset lastModifiedHttpTime = getHttpTimeString(lastModified)>
<cfset parseLastModifiedHttpTimeSTD = parseDateTime(lastModifiedHttpTime)>
<cfset parseLastModifiedHttpTimePOP = parseDateTime(lastModifiedHttpTime, "pop")>
<cfoutput>
<pre>
lastModified (local) : #datetimeformat(lastModified, 'long')#
lastModifiedUTC : #datetimeformat(lastModifiedUTC, 'long')#
lastModifiedUTC2 : #datetimeformat(lastModifiedUTC2, 'long')#
datecompareLmUTC : #dateCompare(lastModifiedUTC, lastModifiedUTC2)# //wtf
lastModifiedHttpTime : #lastModifiedHttpTime#
parseLastModifiedHttpTimeSTD : #datetimeformat(parseLastModifiedHttpTimeSTD, 'long')#
parseLastModifiedHttpTimePOP : #datetimeformat(parseLastModifiedHttpTimePOP, 'long')#
I need a datecompare() combination that returns 0
------------------------------------------------
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP) : #DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP)#
DateCompare(lastModifiedUTC2, parseLastModifiedHttpTimePOP) : #DateCompare(lastModifiedUTC2, parseLastModifiedHttpTimePOP)#
CF Version : #server.coldfusion.productVersion#, update level: #server.coldfusion.updatelevel#
</pre>
</cfoutput>
输出:
lastModified (local) : September 11, 2015 7:10:23 PM PDT
lastModifiedUTC : September 12, 2015 2:10:23 AM UTC
lastModifiedUTC2 : September 15, 2015 4:58:22 PM PDT
datecompareLmUTC : -1 //wtf
lastModifiedHttpTime : Sat, 12 Sep 2015 02:10:23 GMT
parseLastModifiedHttpTimeSTD : September 12, 2015 2:10:23 AM PDT
parseLastModifiedHttpTimePOP : September 12, 2015 2:10:23 AM UTC
I need a datecompare() combination that returns 0
------------------------------------------------
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP) : 1
DateCompare(lastModifiedUTC2, parseLastModifiedHttpTimePOP) : 1
CF Version : 10,0,17,295085, update level: 17
我正在拔头发。
(评论太长)
我根据博客评论对 CF11 进行了一些挖掘。据我所知,最初比较失败的原因是尽管前两个日期看起来相似:
// code
lastModifiedUTC : #DateTimeFormat(lastModifiedUTC, "yyyy-mm-dd HH:nn:ss.L zzz")#
lastModifiedUTC2 : #DateTimeFormat(lastModifiedUTC2, "yyyy-mm-dd HH:nn:ss.L zzz")#
// output
lastModifiedUTC : 2015-09-13 19:51:46.219 UTC
lastModifiedUTC2 : 2015-09-13 19:51:46.219 PDT
...由于时区差异,对象在内部代表不同的时间点。这就是 dateCompare() 无法 return 0 的原因。(第三次比较因同样的原因而失败。)
// code
lastModifiedUTC : #lastModifiedUTC.getTime()#
lastModifiedUTC2 : #lastModifiedUTC2.getTime()#
// output
lastModifiedUTC : 1442173906219
lastModifiedUTC2 : 1442199106219
请注意,如果您将 lastModifiedUTC
与原始(本地)日期进行比较,它是否按预期工作?尽管时区不同,但两个对象在内部仍然表示相同的时间点:
// code
dateCompare : #dateCompare(lastModifiedUTC, lastModified)#
lastModifiedUTC : #lastModifiedUTC.getTime()#
lastModified : #lastModified.getTime()#
lastModifiedUTC : #DateTimeFormat(lastModifiedUTC, "yyyy-mm-dd HH:nn:ss.L zzz")#
lastModified : #DateTimeFormat(lastModified, "yyyy-mm-dd HH:nn:ss.L zzz")#
// output
dateCompare : 0
lastModifiedUTC : 1442173906219
lastModified : 1442173906219
lastModifiedUTC : 2015-09-13 19:51:46.219 UTC
lastModified : 2015-09-13 12:51:46.219 PDT
奇怪的是,第二次比较也失败了 return 0,尽管这两个对象似乎具有相同的时间和时区。但是,如果您查看内部时间值,毫秒数会有所不同。 POP 值的毫秒数始终为零。 DatePart
报告相同的结果。 之类的 是有道理的,因为 POP 日期是通过解析不包含毫秒的字符串创建的。但这并不能解释为什么 DateTimeFormat
将毫秒显示为 非零 。
第二次比较失败return0,因为两个日期的毫秒值不同。与文件日期不同,POP 日期是通过解析不包含毫秒的字符串创建的,因此日期部分始终为零。由于 dateCompare() 执行完整比较(包括毫秒),因此两个日期不相等。
// code
lastModifiedUTC : #DateTimeFormat(lastModifiedUTC, "yyyy-mm-dd HH:nn:ss.L zzz")#
parseLastModifiedHttpTimePOP : #DateTimeFormat(parseLastModifiedHttpTimePOP, "yyyy-mm-dd HH:nn:ss.L zzz")#
lastModifiedUTC : #lastModifiedUTC.getTime()#
parseLastModifiedHttpTimePOP : #parseLastModifiedHttpTimePOP.getTime()#
datePart(lastModifiedUTC) : #datePart("l", lastModifiedUTC)#
datePart(parseLastModifiedHttpTimePOP) : #datePart("l", parseLastModifiedHttpTimePOP)#
// output
lastModifiedUTC : 2015-09-13 19:51:46.219 UTC
parseLastModifiedHttpTimePOP : 2015-09-13 19:51:46.0 UTC
lastModifiedUTC : 1442173906219
parseLastModifiedHttpTimePOP : 1442173906000
datePart(lastModifiedUTC) : 219
datePart(parseLastModifiedHttpTimePOP) : 0
但是,好的一点是,这意味着如果您跳过毫秒并且只向下比较到 "second",即 dateCompare(date1, date2, "s")
:
,则比较有效
// code
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP, "s") : #DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP, "s")#
// output
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP, "s") : 0
顺便说一句,我不确定为什么 Adobe 选择更改像 UTC 日期这样重要的东西的行为。不幸的是,我不知道除了博客评论 a) 更改 jvm 时区或 b) 创建您自己的 dateConvert 版本并改用它。
男孩真是一团糟....
我在太平洋标准时间 Windows 使用最新更新级别的 CF10。我需要一个 datecompare()
组合 returns 0 但我无法让它每次都表现出来,因为 Adobe 决定 change the behavior of DateConvert()
and DateCompare()
<cfset filePath = getBaseTemplatePath()>
<cfset fileinfo = getFileInfo(filePath)>
<cfset lastModified = fileinfo.lastModified>
<cfset lastModifiedUTC = dateConvert("local2utc", lastModified)>
<cfset lastModifiedUTC2 = dateAdd("s", getTimezoneInfo().UtcTotalOffset, lastModified)>
<cfset lastModifiedHttpTime = getHttpTimeString(lastModified)>
<cfset parseLastModifiedHttpTimeSTD = parseDateTime(lastModifiedHttpTime)>
<cfset parseLastModifiedHttpTimePOP = parseDateTime(lastModifiedHttpTime, "pop")>
<cfoutput>
<pre>
lastModified (local) : #datetimeformat(lastModified, 'long')#
lastModifiedUTC : #datetimeformat(lastModifiedUTC, 'long')#
lastModifiedUTC2 : #datetimeformat(lastModifiedUTC2, 'long')#
datecompareLmUTC : #dateCompare(lastModifiedUTC, lastModifiedUTC2)# //wtf
lastModifiedHttpTime : #lastModifiedHttpTime#
parseLastModifiedHttpTimeSTD : #datetimeformat(parseLastModifiedHttpTimeSTD, 'long')#
parseLastModifiedHttpTimePOP : #datetimeformat(parseLastModifiedHttpTimePOP, 'long')#
I need a datecompare() combination that returns 0
------------------------------------------------
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP) : #DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP)#
DateCompare(lastModifiedUTC2, parseLastModifiedHttpTimePOP) : #DateCompare(lastModifiedUTC2, parseLastModifiedHttpTimePOP)#
CF Version : #server.coldfusion.productVersion#, update level: #server.coldfusion.updatelevel#
</pre>
</cfoutput>
输出:
lastModified (local) : September 11, 2015 7:10:23 PM PDT
lastModifiedUTC : September 12, 2015 2:10:23 AM UTC
lastModifiedUTC2 : September 15, 2015 4:58:22 PM PDT
datecompareLmUTC : -1 //wtf
lastModifiedHttpTime : Sat, 12 Sep 2015 02:10:23 GMT
parseLastModifiedHttpTimeSTD : September 12, 2015 2:10:23 AM PDT
parseLastModifiedHttpTimePOP : September 12, 2015 2:10:23 AM UTC
I need a datecompare() combination that returns 0
------------------------------------------------
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP) : 1
DateCompare(lastModifiedUTC2, parseLastModifiedHttpTimePOP) : 1
CF Version : 10,0,17,295085, update level: 17
我正在拔头发。
(评论太长)
我根据博客评论对 CF11 进行了一些挖掘。据我所知,最初比较失败的原因是尽管前两个日期看起来相似:
// code
lastModifiedUTC : #DateTimeFormat(lastModifiedUTC, "yyyy-mm-dd HH:nn:ss.L zzz")#
lastModifiedUTC2 : #DateTimeFormat(lastModifiedUTC2, "yyyy-mm-dd HH:nn:ss.L zzz")#
// output
lastModifiedUTC : 2015-09-13 19:51:46.219 UTC
lastModifiedUTC2 : 2015-09-13 19:51:46.219 PDT
...由于时区差异,对象在内部代表不同的时间点。这就是 dateCompare() 无法 return 0 的原因。(第三次比较因同样的原因而失败。)
// code
lastModifiedUTC : #lastModifiedUTC.getTime()#
lastModifiedUTC2 : #lastModifiedUTC2.getTime()#
// output
lastModifiedUTC : 1442173906219
lastModifiedUTC2 : 1442199106219
请注意,如果您将 lastModifiedUTC
与原始(本地)日期进行比较,它是否按预期工作?尽管时区不同,但两个对象在内部仍然表示相同的时间点:
// code
dateCompare : #dateCompare(lastModifiedUTC, lastModified)#
lastModifiedUTC : #lastModifiedUTC.getTime()#
lastModified : #lastModified.getTime()#
lastModifiedUTC : #DateTimeFormat(lastModifiedUTC, "yyyy-mm-dd HH:nn:ss.L zzz")#
lastModified : #DateTimeFormat(lastModified, "yyyy-mm-dd HH:nn:ss.L zzz")#
// output
dateCompare : 0
lastModifiedUTC : 1442173906219
lastModified : 1442173906219
lastModifiedUTC : 2015-09-13 19:51:46.219 UTC
lastModified : 2015-09-13 12:51:46.219 PDT
奇怪的是,第二次比较也失败了 return 0,尽管这两个对象似乎具有相同的时间和时区。但是,如果您查看内部时间值,毫秒数会有所不同。 POP 值的毫秒数始终为零。 DatePart
报告相同的结果。 之类的 是有道理的,因为 POP 日期是通过解析不包含毫秒的字符串创建的。但这并不能解释为什么 DateTimeFormat
将毫秒显示为 非零 。
第二次比较失败return0,因为两个日期的毫秒值不同。与文件日期不同,POP 日期是通过解析不包含毫秒的字符串创建的,因此日期部分始终为零。由于 dateCompare() 执行完整比较(包括毫秒),因此两个日期不相等。
// code
lastModifiedUTC : #DateTimeFormat(lastModifiedUTC, "yyyy-mm-dd HH:nn:ss.L zzz")#
parseLastModifiedHttpTimePOP : #DateTimeFormat(parseLastModifiedHttpTimePOP, "yyyy-mm-dd HH:nn:ss.L zzz")#
lastModifiedUTC : #lastModifiedUTC.getTime()#
parseLastModifiedHttpTimePOP : #parseLastModifiedHttpTimePOP.getTime()#
datePart(lastModifiedUTC) : #datePart("l", lastModifiedUTC)#
datePart(parseLastModifiedHttpTimePOP) : #datePart("l", parseLastModifiedHttpTimePOP)#
// output
lastModifiedUTC : 2015-09-13 19:51:46.219 UTC
parseLastModifiedHttpTimePOP : 2015-09-13 19:51:46.0 UTC
lastModifiedUTC : 1442173906219
parseLastModifiedHttpTimePOP : 1442173906000
datePart(lastModifiedUTC) : 219
datePart(parseLastModifiedHttpTimePOP) : 0
但是,好的一点是,这意味着如果您跳过毫秒并且只向下比较到 "second",即 dateCompare(date1, date2, "s")
:
// code
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP, "s") : #DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP, "s")#
// output
DateCompare(lastModifiedUTC, parseLastModifiedHttpTimePOP, "s") : 0
顺便说一句,我不确定为什么 Adobe 选择更改像 UTC 日期这样重要的东西的行为。不幸的是,我不知道除了博客评论 a) 更改 jvm 时区或 b) 创建您自己的 dateConvert 版本并改用它。
男孩真是一团糟....