2015-09-12 6 views
6

मैं प्रशांत मानक समय में विंडोज़ पर नवीनतम अद्यतन स्तर के साथ सीएफ 10 का उपयोग कर रहा हूं। मैं एक datecompare() संयोजन कि 0 रिटर्न की जरूरत है लेकिन मैं इसे हर व्यवहार करने के बाद एडोब change the behavior of DateConvert() and DateCompare() करने का फैसला किया नहीं मिल सकता हैकोल्डफ्यूजन 10 में व्यवहार करने के लिए 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 

मैं अपने बालों को बाहर खींच रहा हूँ।

+2

OT: अपने प्रश्न के लिए मददगार नहीं है, लेकिन ईमानदारी से: CF9 के बाद से मैं पर एडोब छोड़ दिया। वे केवल नई कार्यक्षमताओं को जारी करने पर ध्यान केंद्रित करते हैं और बिना किसी फिक्स किए बग के बाद एक बग बनाते हैं। इससे छुटकारा पाएं और लुसी (पूर्व-रेलो) पर स्विच करें। – wiesion

+0

मैंने हमेशा डेटकंपारे() को अनजान होने के लिए पाया है और तुलना ऑपरेटर जैसे ==,> इत्यादि का उपयोग किया है। –

+1

कॉपी और अपशिष्ट लाइन में: 'lastModifiedUTC2:। #datetimeformat (lastModifiedUTC, 'लंबी') #' – 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 

... समय क्षेत्र मतभेद के कारण, आंतरिक वस्तुओं समय की किसी भिन्न स्थिति का प्रतिनिधित्व करते हैं: मैं क्या कह सकता से, कारण प्रारंभिक तुलना में विफल रहता है कि हालांकि पहले दो दिनांकों समान लग रहा है। यही कारण है कि यह के रूप में की उम्मीद काम करता है (एक ही कारण के लिए विफल रहता है। तीसरे तुलना)

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

सूचना यदि आप मूल (स्थानीय) तारीख को lastModifiedUTC तुलना क्यों dateCompare() 0. वापसी करने में विफल रहता है? विभिन्न समय क्षेत्रों के बावजूद, दोनों वस्तुओं अभी भी एक ही बिंदु समय में आंतरिक रूप से प्रतिनिधित्व करते हैं:

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

मजे की बात है, दूसरी तुलना भी, 0 वापसी करने में विफल रहता तथ्य के बावजूद कि दोनों वस्तुओं एक ही समय और समय है लगता है क्षेत्र। हालांकि, यदि आप आंतरिक समय मानों को देखते हैं तो मिलीसेकंड अलग-अलग होते हैं। पीओपी मूल्य के मिलीसेकंड हमेशा शून्य होते हैं। DatePart एक ही परिणाम की रिपोर्ट करता है। का प्रकार समझ में आता है, क्योंकि पीओपी दिनांक एक स्ट्रिंग को पार्स करके बनाया गया था जिसमें मिलीसेकंड नहीं है। फिर भी यह समझा नहीं गया कि क्यों DateTimeFormat मिलीसेकंड को गैर-शून्य दिखाता है।

दूसरी तुलना 0 वापस करने में विफल रही है क्योंकि दोनों तिथियों में अलग मिलीसेकंड मान हैं। फ़ाइल की तारीख के विपरीत, पीओपी दिनांक एक स्ट्रिंग को पार्स करके बनाया गया था जिसमें मिलीसेकंड नहीं है, ताकि दिनांक भाग हमेशा शून्य हो। चूंकि तिथि कॉम्पारे() एक पूर्ण तुलना (मिलीसेकंड सहित) करता है, इसलिए दो तिथियां बराबर नहीं होती हैं।

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

एक के रूप में, मैं नहीं कर रहा हूँ निश्चित रूप से एडोब ने यूटीसी तिथियों के रूप में महत्वपूर्ण कुछ के व्यवहार को बदलने का फैसला क्यों किया .. दुर्भाग्यवश, मुझे नहीं पता कि ब्लॉग टिप्पणियों में उल्लिखित विकल्पों के अलावा आप इसके बारे में बहुत कुछ कर सकते हैं ए) जेवीएम समय क्षेत्र या बी बदलें) तिथि का अपना संस्करण बनाएं और इसके बजाय इसका उपयोग करें।

लड़का क्या एक मेस ....

+0

तय * क्यों DateTimeFormat * के रूप में गैर शून्य मिलीसेकेंड असल में मैं सिर्फ महसूस किया कि मैं जावा के मिलीसेकंड दिखाती है जिनका उपयोग सीएफ के अर्थात् 'एल' के बजाय मार्कर' एस'। मैं परिणामों को बाद में अपडेट कर दूंगा। – Leigh

+1

फिक्स्ड। संक्षेप में, दूसरी तुलना काम करती है यदि आप मिलीसेकंड को छोड़ देते हैं और दूसरी (केवल) यानी 'डेट कॉम्पैयर (डेट 1, डेट 2, "एस") ' – Leigh

+1

ने 'डेटकंपारेयर()' दस्तावेज़ https://wikidocs.adobe.com/wiki/display/coldfusionen/DateCompare पर एक टिप्पणी जोड़ा।" डेटपार्ट हमेशा दूसरे के लिए डिफ़ॉल्ट नहीं है "!!! धन्यवाद लेघ – Henry

संबंधित मुद्दे