Преобразовать метку времени LDAP в MM / дд / гггг ЧЧ: мм: сс в XSLT 1.0 - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь преобразовать метку времени LDAP в XSLT 1.0 в читаемый формат (ММ / дд / гггг ЧЧ: мм: сс), но независимо от того, какую метку времени я ввожу, дата и время всегда неверны. Кто-нибудь знает, где моя проблема или есть лучший метод? Спасибо!

Вот мой шаблон.

<!-- Get last logon date from Active Directory -->
    <xsl:call-template name="ticks-to-datetime">
        <xsl:with-param name="commonName" select="'Last-Logon-to-Domain'" />
    <xsl:with-param name="value" select="132278345110000000" />                 
</xsl:call-template>

<xsl:template name="ticks-to-datetime">
    <xsl:param name="commonName"/>
    <xsl:param name="value"/>

    <xsl:variable name="JDN" select="floor($value div 864000000000) + 1721426" />
    <xsl:variable name="rem-ticks" select="$value 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:element name="field">          
        <xsl:attribute name="commonName">
            <xsl:value-of select="$commonName" />
        </xsl:attribute>

        <xsl:value-of select="format-number($m, '00/')"/>
        <xsl:value-of select="format-number($d, '00/')"/> 
        <xsl:value-of select="format-number($y, '0000')"/> 

        <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:element>

</xsl:template>

1 Ответ

0 голосов
/ 05 марта 2020

Предполагая, что ваш ввод представляет количество единиц в 100 наносекунд, прошедших с 1601-01-01T00: 00: 00, вам необходимо изменить:

<xsl:variable name="JDN" select="floor($value div 864000000000) + 1721426" />

на:

<xsl:variable name="JDN" select="floor($value div 864000000000) + 2305814" />

Тогда ваш шаблон вернет результат 03/04/2020 22:28:31 для ввода 132278345110000000.

...