микросекунда до считываемого datetime в xsl

#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. Большое вам спасибо, это было действительно полезно.