#datetime #xslt-1.0 #datetime-format
#datetime #xslt-1.0 #datetime-формат
Вопрос:
Я хочу преобразовать дату и время в XML-файле, который находится в «микросекунде», в удобочитаемый формат, например (2016-10-14), используя преобразование таблицы стилей XSLT 1.0, это содержимое xml ниже:
<?xml version="1.0" encoding="UTF-8"?>
<News DateTime="636120534151823750" Id="5241">
</News>
Большое спасибо,
Комментарии:
1. Теперь это микросекундная единая временная метка. удаление последних 6 цифр для получения секунд дает вам 9 ноября 22127 года, что немного в будущем… Итак, ЧТО ИМЕННО представляет это число? Откуда это взялось?
2. @Marc B: действительно, 18-значное число OP, похоже, берется из DateTime.Now.Ticks, как показано здесь: dotnetfiddle.net/M6MLsK
3. OP: ваша временная метка даты, показанная в вашем вопросе, не выражается в «микросекундах» (и с каких пор это будет в любом случае? Вы должны как-то упомянуть об этом); похоже, это результат DateTime. Вместо этого тикает, единицей измерения которой является десятая часть микросекунды (10 миллионов таких в секунду): msdn.microsoft.com/en-us/library /…
4. @MarcB: Это приходит от информационного агентства, они отправляют дату и время в этом формате. согласно тому, что они говорят, начиная с 1970 года и до сегодняшнего дня в виде тиков.
5. @YSharp: Вы правы, поскольку я снова проверил источник, они сказали мне, что он в тиках.
Ответ №1:
Попробуйте это так:
<xsl:template match="News">
<dateTime>
<xsl:call-template name="datetime.ticks-to-datetime">
<xsl:with-param name="datetime.ticks" select="@DateTime" />
</xsl:call-template>
</dateTime>
</xsl:template>
<xsl:template name="datetime.ticks-to-datetime">
<xsl:param name="datetime.ticks"/>
<xsl:variable name="JDN" select="floor($datetime.ticks div 864000000000) 1721426" />
<xsl:variable name="rem-ticks" select="$datetime.ticks mod 864000000000"/>
<xsl:variable name="f" select="$JDN 1401 floor((floor((4 * $JDN 274277) div 146097) * 3) div 4) - 38"/>
<xsl:variable name="e" select="4*$f 3"/>
<xsl:variable name="g" select="floor(($e mod 1461) div 4)"/>
<xsl:variable name="h" select="5*$g 2"/>
<xsl:variable name="d" select="floor(($h mod 153) div 5 ) 1"/>
<xsl:variable name="m" select="(floor($h div 153) 2) mod 12 1"/>
<xsl:variable name="y" select="floor($e div 1461) - 4716 floor((14 - $m) div 12)"/>
<xsl:variable name="H" select="floor($rem-ticks div 36000000000)"/>
<xsl:variable name="M" select="floor($rem-ticks mod 36000000000 div 600000000)"/>
<xsl:variable name="S" select="$rem-ticks mod 600000000 div 10000000"/>
<xsl:value-of select="format-number($y, '0000')" />
<xsl:value-of select="format-number($m, '-00')"/>
<xsl:value-of select="format-number($d, '-00')"/>
<xsl:value-of select="format-number($H, ' 00')" />
<xsl:value-of select="format-number($M, ':00')"/>
<xsl:value-of select="format-number($S, ':00')"/>
</xsl:template>
Примененный к вашему примеру ввода, результат будет:
<dateTime>2016-10-14 14:50:15</dateTime>
Комментарии:
1. большое вам спасибо, что решили мою проблему, но можно ли точно так же рассчитать время?
2. Не могли бы вы отредактировать свой вопрос и добавить точный результат, который вы хотите?
3. решение, которое вы предоставили, — это именно то, что я хочу, но для дальнейшего использования я хотел бы знать, как получить время, например: 2016-10-17 12:30:00 Большое спасибо за вашу помощь.
4. @JohnMiller Смотрите редактирование моего сообщения. Обратите также внимание на исправление
JDN
вычисления var.5. Большое вам спасибо, это было действительно полезно.