Как конвертировать тики в читаемое datetime с XSLT?
У меня есть XML с отметками времени:
<node stamp="1236888746689" />
И я бы хотел отобразить их в результате HTML как дату со временем.
Есть ли способ сделать это с помощью XSLT (любая версия)?
EDIT:
Я использую XSLT2.0 с Saxon9. Базовая дата - 1970-01-01 0:00.
Ответы
Ответ 1
Вы берете дату 1970-01-01T00:00:00
и добавляете столько миллисекунд, что значение штампа сообщает вам:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="node">
<xsl:value-of
select='xs:dateTime("1970-01-01T00:00:00") + @stamp * xs:dayTimeDuration("PT0.001S")'/>
</xsl:template>
</xsl:stylesheet>
Ответ 2
Если вы используете процессор XSLT 1.0, который поддерживает функции даты EXSLT (я только что проверил это с libxslt в PHP), вы можете использовать date:add()
и date:duration()
:
<xsl:value-of select="date:add('1970-01-01T00:00:00Z', date:duration(@stamp div 1000))"/>
Функция date:duration()
занимает несколько секунд (поэтому вам нужно разделить миллисекунды на 1000) и превращает ее в "продолжительность" (в данном случае "P14315DT20H12M26.6889998912811S
" ), которая затем добавляется к начало вашей эпохи (выглядит как стандартная эпоха, для этой маркировки) с date:add()
, чтобы получить штамп "2009-03-12T20:12:26.6889998912811Z
". Затем вы можете отформатировать это с помощью функций даты EXSLT или просто substring()
в зависимости от того, что вам нужно.
Ответ 3
Покойный ответ, да, я знаю, но я не мог найти тот, который я искал здесь, поэтому я подумал, что заплачу ему за свое решение.
Мой XML был несколькими узлами, сбрасываемыми с Drupal с использованием export_node и drush. Я использовал xslt-процессор в PHP5, который поддерживает только xslt 1.0. Некоторые функции EXSLT, как представляется, поддерживаются, но я не мог сказать, был ли мой синтаксис неправильным или функция, которую я пыталась использовать, не была поддержана. Во всяком случае, для меня работали. Я использовал код примера из w3schools.com, но добавил строку сразу после объявления xsltprocessor, как показано ниже:
$xp = new XsltProcessor();
$ XP- > registerPHPFunctions();
PHP имеет тривиальную функцию для преобразования даты, поэтому я обманул и использовал процессор PHP, так как я уже использовал его для преобразования моего xsl.
<xsl:for-each select="node_export/node">
<xsl:value-of select="php:function('date', 'n-j-y', number(timestamp))"/>
</xsl:for-each>
Надеюсь, что это поможет кому-то. Я долго стучал головой, когда я работал над этим.
Ответ 4
Если вы хотите использовать процессор XSL 1.0, который не поддерживает функции даты и времени EXSLT, это нетривиально, но это было сделано.
Вы можете посмотреть Katy Coe XSLT 1.0 реализация функции iso-from-unix. Это часть довольно огромного "бесплатного для некоммерческого использования" набора функций даты и времени, которые она создала.
Однако ваш XSL-процессор должен поддерживать пространство имен "http://exslt.org/functions"
, чтобы эта реализация работала. Кроме того, нет никакой зависимости от EXSLT.
P.S.: Я знаю, что временная метка Unix и тики не совсем то же самое. Однако они достаточно близки.
Ответ 5
XSLT Turing завершен, так что должен быть способ.:) Зная хотя бы немного XSLT, это, вероятно, будет включать рекурсию.
Вы не указываете точную интерпретацию своих "тиков", я предполагаю миллисекунды с какой-то эпохи, но что? 1970?