2013-04-30 8 views
11

मैं एक आवेदन जहाँ मैं ColdFusion 8 का उपयोग कर जावास्क्रिप्ट का उपयोग कर विंडोज सर्वर 2008 और क्लाइंट साइड पर चल रहे (गूगल क्रोम में परीक्षण) सर्वर साइड पर युग समय प्राप्त करने की आवश्यकता लिख ​​रहा हूँ। समस्या यह है कि कोल्डफ्यूजन द्वारा उत्पन्न युग का समय जावास्क्रिप्ट द्वारा उत्पन्न एक घंटे के पीछे है। मैंने सत्यापित किया है कि दिनांक/समय सेटिंग्स क्लाइंट साइड और सर्वर दोनों तरफ सही हैं।क्यों ColdFusion युग एक घंटे जावास्क्रिप्ट युग समय के पीछे समय है?

यह वह जगह है मैं कैसे ColdFusion के साथ समय स्टाम्प की स्थापना कर रहा हूँ:

<cfset cfEpoch = DateDiff("s", "January 1 1970 00:00", DateConvert("Local2utc", now()))> 

और यह है मैं यह कैसे जावास्क्रिप्ट के साथ सेट कर रहा हूं:

var jsEpoch = Math.round(new Date().getTime()/1000.0); 

जावास्क्रिप्ट युग इस पर से मेल खाता है वेबसाइट (http://www.epochconverter.com/), क्योंकि वे एक ही विधि का उपयोग किया जा रहा का उपयोग कर रहे हैं जो समझ में आता है। कोल्डफ्यूजन युग एक घंटा पीछे है। यहां बताया गया है कि मैं इस सुलझाने की कोशिश करने के लिए चलाए गया है:

<cfset localDate = now()> 
<cfset utcDate = DateConvert("Local2utc", localDate)> 
<cfset epoch = DateDiff("s", "January 1 1970 00:00", utcDate)> 

<cfoutput> 
    Local Date: #localDate# <br> 
    UTC Date: #utcDate# <br> 
    Epoch: #epoch# 
</cfoutput> 

कि कोड आउटपुट:

Local Date: {ts '2013-04-30 17:44:56'} 
UTC Date: {ts '2013-04-30 21:44:56'} 
Epoch: 1367354696 

तो मैं एक नुकसान में हूँ। स्थानीय दिनांक और यूटीसी दिनांक मूल्य दोनों सही हैं। ऐसा प्रतीत होता है केवल व्याख्या यह है कि DateDiff() फ़ंक्शन ठीक से काम नहीं है, लेकिन मैं अन्य तिथियों के साथ यह परीक्षण किया है और यह ठीक काम करने के लिए लगता है कि। मुझे लगता है कि मैं इसे उत्पन्न करने वाले युग मूल्य में 3600 जोड़ सकता हूं लेकिन मैं यह नहीं जानता कि मुझे पहले स्थान पर गलत मूल्य क्यों मिल रहा है। क्या कोई देखता है कि मैं यहाँ क्या खो रहा हूं?

+0

अपने JVM संस्करण क्या है? और आप किस टीजेड में हैं? –

उत्तर

7

एक छोटी सी लिपि लिखना आपको कुछ अजीब लग सकता है।

यह मेरे लिए क्या यह उत्पादन होता है।

  • 1367360584 - जावास्क्रिप्ट समय
  • 1367360594 - युग सेकंड (स्थानीय समय में युग परिवर्तित)
  • +१३६७३५६९९४ - युग सेकंड (यूटीसी को स्थानीय समय परिवर्तित)

तो परिवर्तित युग स्थानीय समय में पर जगह है, लेकिन दूसरी तरफ नहीं है। यह सीएफ 8 पर भी चल रहा है, इसलिए यदि आप एपोक को स्थानीय समय में परिवर्तित करते हैं, तो ऐसा लगता है कि यह सही है।

इसे आज़माएं।

<script> 
var jsEpoch = Math.round(new Date().getTime()/1000.0); 
document.write(jsEpoch + ' - Javascript time <br>'); 
</script> 


<cfset TheDate = now()> 
<cfoutput> 
#DateDiff("s",DateConvert("utc2Local", "January 1 1970 00:00"), TheDate)# - Epoch seconds (convert Epoch to local time)<br> 
#DateDiff("s", "January 1 1970 00:00", DateConvert("Local2utc", TheDate))# - Epoch seconds (convert local time to UTC) 
</cfoutput> 
+1

गेविन सही है। यह निश्चित रूप से जाने का रास्ता है। आप आसानी से एक लाइन के साथ एक पुन: प्रयोज्य फ़ंक्शन बना सकते हैं: 'फ़ंक्शन getEpoch() {वापसी दिनांकडिफ़ (' s ', dateConvert (' utc2Local ', createDateTime (1 9 70, 1, 1, 0, 0, 0)), अब ());} ' – imthepitts

2

ColdFusion 8, सुंदर पुराना है तो आप अपने JVM संस्करण की जाँच करनी चाहिए। आप पुराने संस्करण चला रहे हैं जो नए डीएसटी नियमों के लिए जिम्मेदार नहीं है। See this Adobe forum for more:

"अमेरिका दिन प्रकाश बचत नियमों ColdFusion की है कि संस्करण के बाद से बदल गया है और यह JRE जहां जारी किया रेखांकित कर रहा है। आप अद्यतन JRE की जरूरत कम से कम 1.6.12 नए नियमों प्राप्त करने के लिए है।"

UPDATED:

आगे के परीक्षण के बाद, JVM मुद्दा नहीं है। मुझे सीएफ 9 पर उपर्युक्त परिणाम मिलते हैं, और हम पहले से ही समय सीमा से पहले ही हैं जहां पुराने नियम और नए नियम अलग-अलग परिणाम लौटाएंगे।

function getEpoch(date localDate=now()){ 
    return dateDiff('s', dateConvert('utc2Local', createDateTime(1970, 1, 1, 0, 0, 0)), localDate); 
} 

या, आप दशमलव ड्रॉप करने int() में परिणाम अंतर्निहित जावा विधि का उपयोग कर सकते (लपेट:

हालांकि, यहां कुछ तरीके आप सही परिणाम प्राप्त कर सकते हैं (गेविन का जवाब करने के लिए धन्यवाद) कर रहे हैं):

int(createObject('java', 'java.lang.System').currentTimeMillis()/1000); 
0

इस समय क्षेत्र के नरक है। यूनिक्स समय यूटीसी समय में 1 9 70 से सेकंड होना चाहिए। लेकिन वे जिस तरह से कोल्डफ्यूजन और रेलो करते हैं, आपको सर्वर समय से सेकंड्स जोड़ने की आवश्यकता नहीं होती है। 1 9 70 में "स्थानीय सर्वर समय" में कनवर्ट करें, फिर सेकंड जोड़ें और फिर यूटीसी में कनवर्ट करें। ऐसा लगता है कि जब यूटीसी में परिवर्तित हो जाता है तो यह केवल घंटे को बदल देता है और यूटीसी डीएसटी नियमों को लागू नहीं करता है। यह सही है: यूनिक्स से

यूटीसी:

CreateODBCDateTime(DateConvert("local2Utc", DateAdd("s", #UNIXTIME#, DateConvert("utc2Local", "January 1 1970 00:00")))) 

यूनिक्स कोई सर्वर स्थानीय समय से:

DateDiff("s",DateConvert("utc2Local", "January 1 1970 00:00"), dateAdd('h',-timezone_hours_local_to_server, #LOCALTIME#)) 
संबंधित मुद्दे