XSLT时区转换

时间:2014-04-29 19:25:40

标签: regex datetime xslt

我正在使用一个只在中央时区(CT)输出服务器时间的系统。我需要在XSLT中将其转换为美国东部时间。

是否有内置方法来翻译这个或我是否需要使用Regex?

<node time="02:14 pm CT" />

当前输出: 02:14 pm CT

期望输出:美国东部时间下午03:14

2 个答案:

答案 0 :(得分:1)

在XSLT 1.0中没有内置的方法。无论如何,这将是相当微不足道的 - 除了你的时间输入是12小时格式的事实。这使得该过程相当繁琐,因此我将其拆分为处理模板:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <node>
        <xsl:attribute name="time">
            <xsl:call-template name="time-offset">
                <xsl:with-param name="time" select="node/@time"/>
            </xsl:call-template>
        </xsl:attribute>
    </node>
</xsl:template>  

<xsl:template name="time-offset">
    <xsl:param name="time"/>
    <xsl:param name="offset" select="1"/>
    <xsl:param name="h12" select="substring($time, 1, 2)"/>
    <xsl:param name="pm" select="contains($time,'p') or contains($time,'P')"/>
    <xsl:param name="h24" select="$h12 mod 12 + 12*$pm"/>
    <xsl:param name="newH24" select="($h24 + $offset + 24) mod 24"/>
    <xsl:param name="newH12" select="($newH24 + 11) mod 12 + 1"/>
    <xsl:param name="am.pm" select="substring('AMPM', 1 + 2*($newH24 > 11), 2)"/>
    <xsl:value-of select="concat(format-number($newH12, '00'), substring($time, 3, 4), $am.pm, ' ET')"/>
</xsl:template>

</xsl:stylesheet>

将上述样式表应用于示例输入时:

<node time="12:14 am CT" />

结果是:

<?xml version="1.0" encoding="UTF-8"?>
<node time="01:14 AM ET"/>

答案 1 :(得分:1)

至少有两条主要路径可供选择,将其转换为时间并使用基于时间的库,或将其作为字符串并进行直接字符串操作。以下是字符串操作:

    <xsl:variable name="time" select="'11:14 pm CT'"/> <!-- the input value -->
    <xsl:variable name="hours" select="number(substring-before($time,':'))"/>  <!-- numeric hours -->
    <xsl:variable name="mer" select="substring($time,7,2)"/>  <!-- the am or pm part -->

    <xsl:choose>
        <xsl:when test="$hours &lt; 12">  <!-- if we are 01-11 -->
            <xsl:value-of select="substring(concat('0', $hours + 1), string-length(concat('0', $hours + 1)) - 1, 2)"/> <!-- add an hour and repad the string with leading zero, messy -->
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>01</xsl:text> <!-- we were 12, so just use 01 -->
        </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="substring($time, 3,4)"/> <!-- pull the minutes forward -->
    <xsl:choose>
        <xsl:when test="not($hours = 11)">  <!-- if we were not 11 for hours we keep the same am/pm -->
            <xsl:value-of select="$mer"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:choose>
                <xsl:when test="$mer = 'pm'"> <!-- otherwise we flip it -->
                    <xsl:text>am</xsl:text>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>pm</xsl:text>                       
                </xsl:otherwise>
            </xsl:choose>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:text> ET</xsl:text>