2011-09-14 259 views
1

使用XSLT 1.0 &收到日期的格式如下:XSL日期和时间差计算(XSLT 1.0)

20111129060804 

,我有一个需要能够计算出他们两个人之间的差异。但是,我不能使用任何扩展

我也有其他限制,以及:

  • 我受限于可能的XSLT内使用的命名空间,
  • 并且其中我使用的XSL样式表(第三方应用程序)它 将不能正确处理xsl中的任何包含/导入操作。

因此,实际上,我需要使用的xslt必须非常自包含,因为所调用或引用的任何内容都必须位于xslt本身中。

我曾考虑采取日期&时间&将其转换为朱利安序列号&处理日期数学很像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 

其中左一切小数点以天,一切小数点右边是在时间(即0.168854166666280 * 24 = 4.0524999999990680,或4小时,一小时的0.0525%,或3.15分钟)。

有没有人曾经在XSLT 1.0中做过这种类型的已过时日期 - 时间数学而不使用扩展?

如果现有的一组代码可以重新使用,我将不胜感激。

编辑 -

我决定与上面进行,并已打在TIME的转换一个障碍。

我使用的例子是: 开始时间= 8时19分37秒 结束时间=十五时58分33秒

这是7时38分56秒(顺便说一句的持续时间/差,这是仅适用于同一天的计算 - 如果Endtime <开始时间或如果日期> 0,我有它会引发错误)。

到达的时候,我把所有东西都转换成秒&然后做数学。 08:19:37转换为29977(8 * 3600小时+ 19 * 60分钟+秒)。 15:58:33转换为57513(15 * 3600小时+ 58 * 60分钟+秒)。

区别是27536秒。

我得到: 三千六分之二万七千五百三十六= 7.6488888888888888888 < - 整数部分是小时 然后27536的差 - 25200 = 2336 < - 的25200 = 7小时*3600秒 六十〇分之二千三百三十六= 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(这是正确的) 然而,叔小时-DIFF一次号格式发生现在有“08”,在它,使我的时间不正确。

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

子,前 & 子,后外 - 这将(我认为)让我有使用在未来的计算之前将结果转换为数字 - 有没有其他办法抓住&未改变的整数部分不必做字符串转换为数字来使用块?

回答

1

尝试使用floor()截断值。 (7.64)= 7

(0124)