Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 在XSLT1.0中将LDAP时间戳转换为MM/dd/yyyy HH:MM:ss_Datetime_Xslt_Ldap_Xslt 1.0_Date Conversion - Fatal编程技术网

Datetime 在XSLT1.0中将LDAP时间戳转换为MM/dd/yyyy HH:MM:ss

Datetime 在XSLT1.0中将LDAP时间戳转换为MM/dd/yyyy HH:MM:ss,datetime,xslt,ldap,xslt-1.0,date-conversion,Datetime,Xslt,Ldap,Xslt 1.0,Date Conversion,我试图将XSLT1.0中的LDAP时间戳转换为可读格式(MM/dd/yyyy HH:MM:ss),但无论输入什么时间戳,日期和时间总是错误的。有人知道我的问题在哪里,或者是否有更好的方法?谢谢大家! 这是我的模板 <!-- Get last logon date from Active Directory --> <xsl:call-template name="ticks-to-datetime"> <xsl:with-param name

我试图将XSLT1.0中的LDAP时间戳转换为可读格式(MM/dd/yyyy HH:MM:ss),但无论输入什么时间戳,日期和时间总是错误的。有人知道我的问题在哪里,或者是否有更好的方法?谢谢大家!

这是我的模板

<!-- 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>

假设您的输入表示自1601-01-01T00:00:00以来经过的100纳秒单位数,您需要更改:

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

致:



<> p>你的模板将返回<代码> 03 / 04 / 2020 22:28:3/<代码>输入的<代码> 132278345110000000 < /代码> .< /p>如果你把你的输入和输出都包括在内你会认为3/5/2020是可读的,但是你的一个好比例的用户要么会误解它,要么认为它含糊不清。你真的确定要这么做吗?@jwm谢谢你的回复!输入是来自LDAP的18位lastlogon时间戳,输出是格式MM/dd/yyyy HH:MM:ss。@MichaelKay很遗憾,我无法控制后端,因此无法更改接受的日期格式!他们只支持MM/dd/yyyy HH:MM:ssOh感谢您的修复!现在日期/时间正确了!非常感谢!我还想知道,我还试图在转换之前检查
的值是否不为空。我试着在我的模板中这样做,但似乎不起作用。知道为什么吗<代码>请分别提问:答案太长,无法发表评论(问题也是如此)。提示1:XSLT中没有
null
。提示2:xsl:choose中定义的变量在它之外没有作用域。它回答了我的问题,非常感谢!有一件事是,有时返回的日期有60秒,因此它会给出一个错误,但我将使用xsl:choose修复它,如果是60秒,则将秒数更改为59秒。非常感谢。这不应该发生。这可能是一个舍入错误。你能举一个这样的例子吗?当然!这里有一个例子。当此时间戳位于输入132278182796606924中时,结果时间为03/04/2020 17:57:60。
<xsl:variable name="JDN" select="floor($value div 864000000000) + 2305814" />