2013-04-30 13 views
11

私は、サーバー側では、Windows Server 2008上で動作するColdFusion 8とjavascript(Google Chromeでのテスト)を使用するクライアント側を使用して、エポックタイムを取得する必要があるアプリケーションを作成しています。問題は、ColdFusionによって生成されるエポック時間が、JavaScriptによって生成される時間より1時間遅れていることです。日付/時刻の設定がクライアント側とサーバー側の両方で正しいことを確認しました。なぜColdFusionエポック時間は、JavaScriptエポック時間より1時間遅れていますか?

これは私が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のエポックは1時間遅れています。ここで私はこれを整理しようとする実行してきたものだ:

<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ですか? –

答えて

7

非常に奇妙なことに気付くかもしれません。

これは私のために出力するものです。

  • 1367360584 - エポック秒(現地時間にエポックを変換)
  • 1367356994 - - エポック秒(UTCに現地時間に変換)

だから、変換エポック現地時間へ

  • 1367360594 Javascriptの時間しかし、周囲の他の方法ではありません。 これは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(){戻り値dateDiff( 's'、dateConvert( 'utc2Local'、createDateTime(1970,1,1,0,0,0))、今すぐ(1つの行で再利用可能な関数を作成することができます。 ));} ' – imthepitts

    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時間は1970年からUTC時間の秒数でなければなりません。しかし、彼らの方法では、Coldfusionとrailoを使用すると、サーバー時間から秒を追加する必要があります。 1970を "localServer time"に変換してから秒を追加し、UTCに変換し直します。 UTCに変換すると時間がシフトするだけで、UTC DSTルールは適用されないようです。これは正しいです:UNIXから

    UTC:

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

    UNIXなしサーバーのローカル時間FROM:

    DateDiff("s",DateConvert("utc2Local", "January 1 1970 00:00"), dateAdd('h',-timezone_hours_local_to_server, #LOCALTIME#)) 
    
    関連する問題