为什么ColdFusion纪元时间落后于javascript纪元时间一小时?

时间:2013-04-30 21:57:21

标签: javascript date coldfusion coldfusion-8 epoch

我正在编写一个应用程序,我需要在服务器端使用在Windows Server 2008上运行的ColdFusion 8和客户端使用javascript(在Google Chrome中进行测试)获取纪元时间。问题是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 epoch匹配此网站(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但是我不想在不知道为什么我首先得到一个不正确的值的情况下这样做。有谁看到我在这里缺少的东西?

3 个答案:

答案 0 :(得分:8)

写一个小脚本你可能会注意到一些非常奇怪的东西。

这就是它为我输出的内容。

  • 1367360584 - Javascript time
  • 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 :(得分:2)

ColdFusion 8已经很老了,所以你应该检查你的JVM版本。您可能正在运行一个不考虑新DST规则的过时版本。 See this Adobe forum for more:

  

“美国日光节约规则自该版本以来发生了变化   ColdFusion和它强调JRE在哪里发布。你需要   将JRE更新为至少1.6.12以获得新规则。“

<击>

<强>更新:

经过进一步测试,JVM不是问题。我在CF9上获得了与上面相同的结果,并且我们已经超过旧规则和新规则将返回不同结果的时间范围。

但是,有几种方法可以获得正确的结果(感谢Gavin的回答):

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);

答案 2 :(得分:0)

这是时区地狱。 Unix时间应该是UTC时间1970年的秒数。但他们的方式是Coldfusion和railo这样做,你需要从服务器时间添加秒而不是utc。将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#))