使用 XSLT 1.0 并按以下格式接收日期:
20111129060804
我需要能够计算其中两个之间的差异。但是,我不能使用任何扩展。
我也有其他限制:
- 我受限于可以在 XSLT 中使用的命名空间,
- 在我使用 xsl 样式表(第 3 方应用程序)的地方,它将无法正确处理 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 的转换上遇到了障碍。
我使用的示例是:开始时间 = 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 <-- 整数部分是 3然后差 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和substring-after之外- 这将(我认为)让我必须在下一次计算中使用之前将结果转换为数字 - 还有其他方法可以获取数字的未更改整数部分而不是必须从字符串转换为数字才能使用这些片段?