2015-09-12 21 views
6

私は太平洋標準時のWindowsで最新の更新レベルでCF10を使用しています。私は私の髪を引っ張ってるDateCompare()をColdFusion 10で動作させるにはどうすればよいですか?

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 

:私は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> 

にOUTPUTを決めたので、それがすべてのように動作させることはできませんdatecompare()組み合わせを必要としています。

+2

OT:あなたの質問に役立つ、正直なところはない:CF9ので、私は、Adobeをあきらめました。彼らは新しい機能をリリースし、それを修正することなくバグの後に1つのバグを作成することに集中します。それを取り除いてLucee(元Railo)に切り替えてください。 – wiesion

+0

私はdatecompare()が直感的でないと判断し、==、>などの比較演算子を使用します。 –

+1

コピーして無駄にしています: 'lastModifiedUTC2:#datetimeformat(lastModifiedUTC、 'long')#' – Alex

答えて

6

(コメントが長すぎます)

私はいくつかのブログのコメントに基づいて、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 

が...、内部オブジェクトが異なる時点を表す:私が言うことができるものから、最初の比較が失敗した理由は、最初の2つの日付が同じように見えるが、ということです。あなたは、元の(ローカル)の日付にlastModifiedUTCを比較する場合に予想されるようdateCompare()は0を返すことに失敗した理由は

// code 
lastModifiedUTC    : #lastModifiedUTC.getTime()# 
lastModifiedUTC2    : #lastModifiedUTC2.getTime()# 
// output 
lastModifiedUTC    : 1442173906219 
lastModifiedUTC2    : 1442199106219 

お知らせ(第3の比較は、同じ理由で失敗した。)で、それは動作しますか?異なるタイムゾーンにもかかわらず、両方のオブジェクトは、まだ内部で時間内に同じポイントを表す:

// 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 

不思議なことに、第2の比較は、両方のオブジェクトが同じ時間と時間を持っているように見えるという事実にもかかわらず、0を返すことに失敗しましたゾーン。しかし、内部時間値を見ると、ミリ秒が異なります。 POP値のミリ秒は常にゼロです。 DatePartは同じ結果を報告します。その ソートのは、ミリ秒を含まない文字列を解析することによってPOPの日付が作成されたので意味があります。しかし、それで DateTimeFormatのミリ秒数が で0以外のと表示される理由については説明しません。

2つの日付のミリ秒値が異なるため、2番目の比較では0が返されません。ファイル日付とは異なり、日付部分が常にゼロになるように、ミリ秒を含まない文字列を解析することによってPOP日付が作成されました。 dateCompare()は完全な比較(ミリ秒を含む)を実行するので、2つの日付は等しくありません。

// 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 

は、しかし、良い調子で、それはあなたがミリ秒をスキップしてのみ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を作成して代わりに使用します。どのような混乱

ボーイ....

+0

*なぜDateTimeFormatはミリ秒を非ゼロとして表示するのですか?実際には私はjavaのミリ秒 – Leigh

+1

要約すると、2番目の比較は、ミリ秒を省略し、2番目(唯一)の 'dateCompare(date1、date2、 '' s '') ' – Leigh

+1

は' DateCompare() 'doc https://wikidocs.adobe.com/wiki/display/coldfusionen/DateCompareにコメントを追加しました。" datePartは常に2番目の "!!!! Thanks Leigh – Henry

関連する問題