XSL日期&时差计算(XSLT 1.0)

时间:2011-09-14 16:59:36

标签: datetime xslt-1.0 datediff julian

使用XSLT 1.0&按以下格式接收日期:

20111129060804

我需要能够计算其中两个之间的差异。但是,我无法使用任何扩展程序

我也有其他限制:

  • 我对可能在XSLT中使用的命名空间有限,
  • 以及我使用xsl样式表(第三方应用程序)的地方 将无法正确处理xsl中的任何包含/导入操作。

所以实际上,我需要使用的xslt必须非常具有自包含性,因为无论调用还是引用都必须在xslt本身。

我曾考虑过拍摄日期&时间&将其转换为Julian序列号&处理日期数学的方式与Excel的方式非常相似。示例 -

09/14/2011 08:19:37 = 40800.346956018500000
09/15/2011 12:22:46 = 40801.515810185200000
difference 1 day 4 hours 3 minutes and 9 seconds
difference = 1.168854166666280

小数点左边的所有内容都是以天为单位,小数点右边的所有内容都是及时的(即.168854166666280 * 24 = 4.0524999999990680,或4小时和.0525%的小时,或3.15分钟)。

有没有人在不使用扩展程序的情况下在XSLT 1.0中完成此类经过的日期时间数学运算?

如果有一套我可以重新使用的现有代码,我将不胜感激任何想法,建议或参考。

编辑 -

我决定继续上面的事情,并且在转换TIME时遇到了麻烦。

我使用的例子是: 开始时间= 08:19:37 结束时间= 15:58:33

这是7:38:56的持续时间/差异(顺便说一句,这仅用于当天计算 - 如果Endtime< Start Time或者如果Day是> 0,我会抛出错误)。

到达时间,我将所有内容转换为秒和&然后做数学。 08:19:37转换为29977(8 * 3600小时+ 19 * 60小时+秒)。 15:58:33转换为57513(15 * 3600小时+ 58 * 60分钟+秒)。

差异是27536秒。

我得到: 27536/3600 = 7.6488888888888888888< - 整数部分是小时 然后27536 - 25200 = 2336< - 25200 = 7小时* 3600秒的差异 2336/60 = 38.93333333333333333< - 整数部分是38分钟 然后2336 - 2280 = 56秒的差异从上面。

但是,如果我尝试抓取这些数字的整数部分,则需要进行四舍五入。

<xsl:template name="time-difference">  
<xsl:param name="from-hour"/>  
<xsl:param name="from-minute"/>  
<xsl:param name="from-second"/>  
<xsl:param name="to-hour"/>  
<xsl:param name="to-minute"/>  
<xsl:param name="to-second"/>  
<xsl:variable name="f-secs" select="($from-hour * 3600) + ($from-minute * 60) + ($from-second)"/>  
<xsl:variable name="t-secs" select="($to-hour * 3600) + ($to-minute * 60) + ($to-   second)"/>  
<xsl:variable name="sec-diff" select="$t-secs - $f-secs"/>  
<xsl:variable name="daysec-diff" select="format-number(($sec-diff div 86400),'#')"/>  
<xsl:variable name="q" select="($sec-diff div 3600)"/>  
<xsl:variable name="t-hrs-diff" select="format-number(($sec-diff div 3600),'00')"/>  

上面的变量q有7.648888888888888888(这是正确的) 然而,一旦格式号发生,t-hrs-diff现在就有“08”,这使我的时间不正确。

我知道任何其他格式化尝试获取数字的整数部分都会导致舍入。

substring-before 之外&amp; substring-after - 这会(我想)让我必须在下一次计算中使用之前将结果转换为数字 - 是否有其他方法来获取未经改动的数字的整数部分&amp;不必从字符串转换为数字来使用这些部分吗?

1 个答案:

答案 0 :(得分:1)

尝试使用floor()截断您的值。

楼层(7.64)= 7