FormCalc日期函数不会返回当前系统日期

时间:2016-01-25 09:06:38

标签: date timezone adobe livecycle

如何根据当前系统日期获取日期功能以返回日期? 现在,使用下面的代码片段,它始终返回英国时间,而不是当前系统日期。

<calculate>
<script>$ = concat( num2date(date(), DateFmt()), " ", num2Time(Time(), TimeFmt()) )</script>

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

这可能不是英国时间,而是GMT(或UTC,使用更精确的术语)。英国恰好在冬季与GMT保持一致,但在夏季它将向BST推进一小时的夏令时。

现在,我自己从未使用过LiveCycle,但是,我已经阅读了LiveCycle FormCalc Date and Time Functionsthe spec的一些最小文档,在我看来,一些重大错误是制成。

datetime函数返回基于UTC的值,但只有与时间相关的函数已知道本地时区。也就是说,有单独的Num2TimeNum2GMTime函数,但只有一个Num2Date函数。

Num2Date函数按整数天工作,因此它们只是1900-01-01以来的几天。因此,传递给函数的数字必须已经代表所需的时区。但是,Date函数仅获取当前的GMT日期。似乎没有函数来获取当前的本地日期。

由于涉及毫秒精度,因此在时间方面有所不同。然而,这里还有另一个缺陷。尽管文档说Time函数返回“自纪元以来的毫秒数”,但其实际仅返回自午夜 GMT以来的毫秒数。从日期部分开始没有日常累积的毫秒数。 docs here甚至位于他们的示例代码中,其中包含:

  

返回当前系统时间,作为自纪元以来的毫秒数。

     

时间()=&gt; 71533235正好在下午3:52:15 2003年9月15日,东部标准时间(EST)区域的用户。

如果情况确实如此(并确保使用他们的1900-01-01纪元),该值实际上将包括另外3272572800000毫秒,表示1900-01-012003-09-15之间的天数,带来总时间戳为3272644333235.此外,还有一个拼写错误,因为他们给出的时间戳是3:52:13,而不是3:52:15。显然,没有人密切关注这些文档!

真正的问题是,无法确定本地时区当前天午夜以来的毫秒数在天是相同的。如果不是获取当前时间,而是使用过去存储的时间值,如果由于夏令时,当前偏移量不同,则可能是一小时关闭(+或 - )。示例:东部时间可能是UTC-5或UTC-4,但Num2Time函数仅使用当前有效的偏移量,即使您使用的日期使用的是其他偏移量。

因此,总而言之,Date函数不足以导致您的观察,并且日期/时间功能通常设计不当。鉴于此API的限制,我甚至无法推荐一种解决方法。必须使用某种LocalDate函数代替Date函数,但它不存在。

我能提供的唯一建议是(从我的研究,而不是经验)看,LiveCycle可以使用 FormCalc或JavaScript。所以 - 改用JavaScript。