在 XSLT 1.0 中将 LDAP 时间戳转换为 MM/dd/yyyy HH:mm:ss
Convert LDAP Timestamp to MM/dd/yyyy HH:mm:ss in XSLT 1.0
我正在尝试将 XSLT 1.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" />
至:
<xsl:variable name="JDN" select="floor($value div 864000000000) + 2305814" />
然后您的模板将 return 03/04/2020 22:28:31
的结果用于 132278345110000000
的输入。
我正在尝试将 XSLT 1.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" />
至:
<xsl:variable name="JDN" select="floor($value div 864000000000) + 2305814" />
然后您的模板将 return 03/04/2020 22:28:31
的结果用于 132278345110000000
的输入。