日期差计算返回错误的值

7
我有一个名为date1的变量,其中包含使用parseDateTime生成的ColdFusion日期/时间对象。当我转储变量时,我会得到{ts'2014-12-20 15:46:57'}
我还有另一个变量,名为date2,其中包含由dateConvert("local2utc",now())生成的另一个ColdFusion日期/时间对象。当我转储变量时,我会得到{ts'2014-12-20 15:49:40'}
但是,当我执行dateDiff("s",date1,date2)时,我得到了-21436,这是太多秒了。有人能解释一下为什么会发生这种情况吗?我认为这可能是一个时区问题,但我无法理解。 复制代码
<cfset dtString = "Saturday, December 20, 2014 05:07:30 PM">

<cfset dtObject = parseDateTime(dtString)>

<cfdump var="#dtObject#">

<cfset utcNow = dateConvert("local2utc",now())>

<br><br><cfdump var="#utcNow#">

<br><br><cfdump var="#dateDiff("s",dtObject,utcNow)#">

1
你能否提供一个可复制粘贴的重现问题的案例吗? - Matt Busche
不,如果没有看到能够演示你所遇到问题的可重现案例,我们无法发表任何评论。请阅读此文及其中链接的文档:http://blog.adamcameron.me/2013/09/short-self-contained-correct-compilable.html - Adam Cameron
4
我猜想你处于UTC-6的时区?如果你在谷歌上搜索CF bugbase(https://www.google.co.uk/search?q=bugbase.adobe.com+dateConvert),会发现有很多与dateConvert()相关的问题,这些问题似乎和你看到的情况类似。Adobe声称已经修复了它们,但是我对他们的把握并不太大。我猜测你的第一个日期是本地时区的时间,而第二个日期是UTC时间,所以你在dateAdd()结果中得到了那个偏移量。至于为什么你在<cfdump>中没有看到时区差异?不知道。但这并不让我感到意外。 - Adam Cameron
1
谢谢Adam。这似乎与https://bugbase.adobe.com/index.cfm?event=bug&id=3338974上的问题有关。如果我执行`<cfset utcNow = dateConvert("local2utc",now()).toString()>`,问题便会消失。 - Michael
你们其中一位应该把这个 bug(以及可能的解决方法)发布为答案 :) - Leigh
显示剩余2条评论
2个回答

6
这个问题的原因似乎是由于在 https://bugbase.adobe.com/index.cfm?event=bug&id=3338974 中描述的错误导致的。

如上面的URL所述,“从DateConvert(“local2Utc”,now())返回的变量似乎携带了从本地到UTC的偏移量。当您使用该变量进行几乎任何操作(包括cfqueryparam)时,您得到的值将偏离该偏移量的数量(即回到您传递的值)”。

解决方法似乎是在转换后将日期转换为字符串。我已创建了一个简单的包装器函数:

<cffunction name="local2utc" output="no">
    <cfargument name="date">

    <cfreturn dateConvert("local2utc",arguments.date).toString()>

</cffunction>

0

另一个解决方法是使用parseDateTime。

<cfset localDate = now()>
<cfset utcDate = DateConvert("local2utc", localDate)> 
<cfset utcfix = parseDateTime(utcDate)> 

utc epoch: #DateDiff("s", "January 1 1970 00:00", utcfix)#<br>
loc epoch: #DateDiff("s", "January 1 1970 00:00", localDate)#

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接