问题描述
我们正在尝试使用XSLT扩展名将DateTime从GMT转换为EST。我们正在使用Java的SimpleDateFormat和TimeZone设置timeZone并对其进行格式化。这是将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>