XSL Расчет даты и времени (XSLT 1.0) - PullRequest
1 голос
/ 14 сентября 2011

Использование 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

, где все, что осталось от десятичного знака, находится в днях, а все, что находится справа от десятичного знака, - во времени (т. Е. 168854166666280 * 24 = 4,0524999999990680 или 4 часа и 0,0525 процента от часа,или 3,15 минуты).

Кто-нибудь когда-либо делал этот тип математики даты и времени в XSLT 1.0 без использования расширений?

Буду признателен за любые мысли, предложения или ссылки, если существует существующий набор кода, который я могу изменить.

РЕДАКТИРОВАТЬ -

Я решил продолжить с вышеизложенного, истолкнулся с проблемой преобразования времени.

Пример, который я использую: Время начала = 08:19:37 Время окончания = 15: 58: 33

, то есть продолжительность / разницаиз 7:38:56 (Кстати, это только для расчета в тот же день - у меня есть, чтобы выдать ошибку, если Конечное время <Время начала или если День>> 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 секунд сверху.</p>

Однако, если я попытаюсь получить целую часть этих чисел, она будет округлена.

<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 - что ( я думаю ) заставит меня преобразоватьприведите к числу перед использованием в следующем вычислении - есть ли ЛЮБОЙ другой способ получить неизмененную целую часть числа и не нужно выполнять преобразование из строки в число, чтобы использовать кусочки?

1 Ответ

1 голос
/ 30 ноября 2011

Попробуйте использовать floor () для усечения ваших значений.

floor (7.64) = 7

...