FormCalc Date 函数不 returns 当前系统日期
FormCalc Date function doesn't returns current system date
如何根据当前系统日期获取日期函数到return日期?
现在,使用下面的代码片段,它始终是 return 的英国时间,而不是当前系统日期。
<calculate>
<script>$ = concat( num2date(date(), DateFmt()), " ", num2Time(Time(), TimeFmt()) )</script>
感谢您的帮助!
这可能不是英国时间,而是 GMT(或 UTC,使用更精确的术语)。英国恰好在冬天与 GMT 对齐,但在夏天它提前一小时到 BST 以实现夏令时。
现在,我自己从未使用过 LiveCycle,但尽管如此,我还是通读了一些关于 LiveCycle FormCalc Date and Time Functions, and the spec 的极简文档,在我看来,我犯了一些严重错误。
date
和 time
函数 return UTC-based 值,但只有 time-related 函数知道本地时区。也就是说,有单独的Num2Time
和Num2GMTime
函数,但只有一个Num2Date
函数。
Num2Date
函数以 整数天 计算,因此它们只是自 1900-01-01
以来的天数。因此,传递给函数的数字必须已经代表所需的时区。但是,Date
函数只能获取当前的 GMT 日期。似乎没有获取当前 local 日期的函数。
时间方面有所不同,因为涉及毫秒精度。但是,这里还有另一个缺陷。尽管文档说 Time
函数 returning "the number of milliseconds since the epoch",它的 实际上 return 仅自 [= 以来的毫秒数46=]午夜 格林威治标准时间。从日期部分开始没有 day-over-day 毫秒累积。 docs here 甚至在他们的示例代码中说:
Returns the current system time as the number of milliseconds since the epoch.
Time() => 71533235 at precisely 3:52:15 P.M. on September 15th, 2003 to a user in the Eastern Standard Time (EST) zone.
如果情况确实如此(并确保使用他们的 1900-01-01 纪元),该值实际上将包括额外的 3272572800000 毫秒,代表 1900-01-01
和 2003-09-15
之间的天数,使总时间戳达到 3272644333235。此外,这里有一个错字,因为他们给出的时间戳是 3:52:13,而不是 3:52:15。显然没有人密切关注这些文档!
真正的问题是,无法确定本地时区 当前 日午夜以来的毫秒数在每个 都相同 天。如果不是获取当前时间,而是使用过去存储的时间值,如果当前偏移量因夏令时而不同,则可能会关闭一个小时(+ 或 -)。示例:东部时间可能是 UTC-5 或 UTC-4,但 Num2Time
函数只会使用当前有效的偏移量,即使您正在使用的日期使用其他偏移量也是如此。
因此,综上所述,Date
功能不足,导致您的观察,并且 date/time 功能总体上设计不佳。鉴于此 API 的限制,我什至无法推荐解决方法。必须使用某种 LocalDate
函数来代替 Date
函数,但它不存在。
我能提供的唯一建议是(根据我的研究,而非经验)LiveCycle 可以使用 FormCalc 或 JavaScript。所以 - 使用 JavaScript 代替。
如何根据当前系统日期获取日期函数到return日期? 现在,使用下面的代码片段,它始终是 return 的英国时间,而不是当前系统日期。
<calculate>
<script>$ = concat( num2date(date(), DateFmt()), " ", num2Time(Time(), TimeFmt()) )</script>
感谢您的帮助!
这可能不是英国时间,而是 GMT(或 UTC,使用更精确的术语)。英国恰好在冬天与 GMT 对齐,但在夏天它提前一小时到 BST 以实现夏令时。
现在,我自己从未使用过 LiveCycle,但尽管如此,我还是通读了一些关于 LiveCycle FormCalc Date and Time Functions, and the spec 的极简文档,在我看来,我犯了一些严重错误。
date
和 time
函数 return UTC-based 值,但只有 time-related 函数知道本地时区。也就是说,有单独的Num2Time
和Num2GMTime
函数,但只有一个Num2Date
函数。
Num2Date
函数以 整数天 计算,因此它们只是自 1900-01-01
以来的天数。因此,传递给函数的数字必须已经代表所需的时区。但是,Date
函数只能获取当前的 GMT 日期。似乎没有获取当前 local 日期的函数。
时间方面有所不同,因为涉及毫秒精度。但是,这里还有另一个缺陷。尽管文档说 Time
函数 returning "the number of milliseconds since the epoch",它的 实际上 return 仅自 [= 以来的毫秒数46=]午夜 格林威治标准时间。从日期部分开始没有 day-over-day 毫秒累积。 docs here 甚至在他们的示例代码中说:
Returns the current system time as the number of milliseconds since the epoch.
Time() => 71533235 at precisely 3:52:15 P.M. on September 15th, 2003 to a user in the Eastern Standard Time (EST) zone.
如果情况确实如此(并确保使用他们的 1900-01-01 纪元),该值实际上将包括额外的 3272572800000 毫秒,代表 1900-01-01
和 2003-09-15
之间的天数,使总时间戳达到 3272644333235。此外,这里有一个错字,因为他们给出的时间戳是 3:52:13,而不是 3:52:15。显然没有人密切关注这些文档!
真正的问题是,无法确定本地时区 当前 日午夜以来的毫秒数在每个 都相同 天。如果不是获取当前时间,而是使用过去存储的时间值,如果当前偏移量因夏令时而不同,则可能会关闭一个小时(+ 或 -)。示例:东部时间可能是 UTC-5 或 UTC-4,但 Num2Time
函数只会使用当前有效的偏移量,即使您正在使用的日期使用其他偏移量也是如此。
因此,综上所述,Date
功能不足,导致您的观察,并且 date/time 功能总体上设计不佳。鉴于此 API 的限制,我什至无法推荐解决方法。必须使用某种 LocalDate
函数来代替 Date
函数,但它不存在。
我能提供的唯一建议是(根据我的研究,而非经验)LiveCycle 可以使用 FormCalc 或 JavaScript。所以 - 使用 JavaScript 代替。