Xml 如何在XSLT中将日期时间从一个时区转换为另一个时区

Xml 如何在XSLT中将日期时间从一个时区转换为另一个时区,xml,datetime,xpath,xslt-1.0,xalan,Xml,Datetime,Xpath,Xslt 1.0,Xalan,我们正试图通过使用XSLT扩展将日期时间从GMT转换为EST。我们使用java的SimpleDataFormat和TimeZone来设置时区并格式化它。这是将时区从一种格式格式化为另一种格式,但不是将DateTime转换为EST。 如果我遗漏了什么,有人能帮我吗 这是我的XSL- <?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http:

我们正试图通过使用XSLT扩展将日期时间从GMT转换为EST。我们使用java的SimpleDataFormat和TimeZone来设置时区并格式化它。这是将时区从一种格式格式化为另一种格式,但不是将DateTime转换为EST。 如果我遗漏了什么,有人能帮我吗

这是我的XSL-

  <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:cal="java.util.GregorianCalendar" xmlns:tz="java.util.TimeZone" xmlns:dt="java.util.Date" xmlns:SimpleDateFormat="java.text.SimpleDateFormat"  exclude-result-prefixes="xsl Extensions java math fn fo xs Extensions sf cal dt" xmlns:math="xalan://java.lang.Math" xmlns:java="http://xml.apache.org/xalan/java">
    
    
        <xsl:template name="convertGMTDateToEST">
                <xsl:variable name="dateString">
                    <xsl:value-of select="'08/17/20 17:58'" />
                </xsl:variable>
                <xsl:variable name="inSDF" select="SimpleDateFormat:new('MM/dd/yy HH:mm')"/>
                <xsl:variable name="outSDF" select="SimpleDateFormat:new('MM-dd-yy HH:mm')"/>
                <xsl:variable name= "inTZ" select="tz:getTimeZone('Asia/Kolkata')"/>
                <xsl:variable name= "outTZ" select="tz:getTimeZone('America/New_York')"/>
                <xsl:variable name = "setTZToInput" select="SimpleDateFormat:setTimeZone($inSDF,$inTZ)"/>
                <xsl:variable name = "setTZToOutput" select="SimpleDateFormat:setTimeZone($outSDF,$outTZ)"/>
                <xsl:variable name = "inDate" select="SimpleDateFormat:parse($inSDF,$dateString)"/>
                <xsl:variable name= "outDate" select="SimpleDateFormat:format($outSDF,$inDate)"/>
                <xsl:value-of select="$outDate" /> 
            </xsl:if>
        </xsl:template>
    
    
    </xsl:stylesheet>

电流输出-
08-17-20 17:58

预期输出-
08-17-20 13:58


注意-我们使用的是Xalan XSLT 1.0引擎-
javax.xml.transform.TransformerFactory
您试图处理美国/纽约时间的UTC,但在输入时区中,您以IST传递时间

你应该在下面通过

<xsl:variable name="inTZ" select="tz:getTimeZone('UTC')"/>

更新的XSLT

    <?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:cal="java.util.GregorianCalendar" xmlns:tz="java.util.TimeZone" xmlns:dt="java.util.Date" xmlns:SimpleDateFormat="java.text.SimpleDateFormat"  exclude-result-prefixes="xsl java math fn fo xs cal dt" xmlns:math="xalan://java.lang.Math" xmlns:java="http://xml.apache.org/xalan/java">
    
    <xsl:template match="/">
        <xsl:call-template name="convertGMTDateToEST"></xsl:call-template>
    </xsl:template>
    
    <xsl:template name="convertGMTDateToEST">
        <xsl:variable name="dateString">
            <xsl:value-of select="'08/17/20 17:58'" />
        </xsl:variable>
        <xsl:message><xsl:value-of select="$dateString"/></xsl:message>
        <xsl:variable name="inSDF" select="SimpleDateFormat:new('MM/dd/yy HH:mm')"/>
        <xsl:variable name="outSDF" select="SimpleDateFormat:new('MM-dd-yy HH:mm')"/>
        <xsl:variable name="inTZ" select="tz:getTimeZone('UTC')"/>
        <xsl:variable name="outTZ" select="tz:getTimeZone('America/New_York')"/>
        <xsl:variable name="setTZToInput" select="SimpleDateFormat:setTimeZone($inSDF,$inTZ)"/>
        <xsl:variable name="setTZToOutput" select="SimpleDateFormat:setTimeZone($outSDF,$outTZ)"/>
        <xsl:variable name="inDate" select="SimpleDateFormat:parse($inSDF,$dateString)"/>
        <xsl:variable name="outDate" select="SimpleDateFormat:format($outSDF,$inDate)"/>
        <xsl:value-of select="$outDate" /> 
        
    </xsl:template>
    
    
</xsl:stylesheet>


我建议您不要使用
SimpleDateFormat
时区
日期
。这些类设计得很糟糕,而且早已过时,第一个类尤其令人讨厌。我没有在XSLT中使用Java的经验,但我认为可以使用
LocalDateTime
DateTimeFormatter
,这两种方法都可以替代。我尝试将IST更改为UTC,但都不起作用。我们还缺少什么吗?