2013-04-30 125 views
11

我正在編寫一個應用程序,我需要在服務器端使用在Windows Server 2008上運行的ColdFusion 8以及使用javascript(在Google Chrome中測試)的客戶端獲取時代。問題是由ColdFusion生成的時代比JavaScript生成的時代落後一個小時。我已經驗證日期/時間設置在客戶端和服務器端都是正確的。爲什麼ColdFusion時代在javascript時代後一小時?

這是我如何設置與ColdFusion的時間戳:

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

這就是我如何使用JavaScript將其設置:

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

JavaScript的時代相匹配的這一個網站(http://www.epochconverter.com/)這是有道理的,因爲他們正在使用我使用的相同方法。 ColdFusion時代落後了一個小時。以下是我已經運行,試圖排序了這一點:

<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 

所以我不知所措。本地日期和UTC日期值都是正確的。看來唯一的解釋是DateDiff()函數工作不正常,但我用其他日期測試過,它似乎工作正常。我想我可以將3600添加到它生成的時代值,但我寧願不這樣做,而不知道爲什麼我首先得到一個不正確的值。有沒有人看到我在這裏失蹤?

+0

什麼是你的JVM版本?你有什麼TZ? – 2013-04-30 22:07:02

回答

7

寫一個小腳本,你可能會注意到一些很奇怪的東西。

這就是它爲我輸出的內容。

  • 1367360584 - 的Javascript時間
  • 1367360594 - 大紀元秒(轉換大紀元本地時間)
  • 1367356994 - 大紀元秒(當地時間轉換成UTC)

所以轉換時期爲本地時間是現貨,但其他方式不是。 這也是在CF8上運行的,所以如果你將Epoch轉換爲當地時間,它似乎是正確的。

試一試。

<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

加文是正確的。這絕對是要走的路。你可以用一行簡單地創建一個可重複使用的函數: 'function getEpoch(){return dateDiff('s',dateConvert('utc2Local',createDateTime(1970,1,1,0,0,0)),now ));}' – imthepitts 2013-04-30 23:01:51

2

ColdFusion 8很舊,所以你應該檢查你的JVM版本。您可能正在運行過時的版本,但未考慮新的DST規則。 See this Adobe forum for more:

「美國日光節約規則,因爲 的ColdFusion該版本的改變,它強調JRE其中釋放。你需要 更新JRE到至少1.6.12以獲得新的規則。」

更新:

經過進一步檢測,JVM不是問題。我在CF9上獲得了與上述相同的結果,而且我們已經超過了舊規則和新規則將返回不同結果的時間範圍。

但是,這裏有幾個方法,你可以得到正確的結果(感謝加文的答案):

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

或者,您也可以訪問底層的Java方法(包裹結果int()下降小數):

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

這是時區地獄。 Unix時間應該是UTC時間1970年以後的秒數。但他們的方式Coldfusion和鐵路做到這一點,你需要從服務器時間添加幾秒鐘不utc。將1970轉換爲「本地服務器時間」,然後添加秒,然後轉換回UTC。看起來,轉換爲UTC時,它只是改變小時,不適用UTC DST規則。這是正確的:從UNIX

UTC:

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

UNIX從無服務器本地時間:

DateDiff("s",DateConvert("utc2Local", "January 1 1970 00:00"), dateAdd('h',-timezone_hours_local_to_server, #LOCALTIME#)) 
相關問題