使用XSLT 1.0&按以下格式接收日期:
20111129060804
我需要能够计算其中两个之间的差异。但是,我无法使用任何扩展程序。
我也有其他限制:
所以实际上,我需要使用的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;不必从字符串转换为数字来使用这些部分吗?
答案 0 :(得分:1)
尝试使用floor()截断您的值。
楼层(7.64)= 7