java exslt date-time()生成意外输出

java exslt date-time()生成意外输出,java,xslt-1.0,xalan,exslt,Java,Xslt 1.0,Xalan,Exslt,在执行xslt转换时,时区以一种奇怪的方式序列化 我尝试在xalan和jaxen之间切换实现,但没有观察到任何变化 尝试手动设置日期格式,但似乎找不到使用该格式添加时区(例如+05:30或-08:00)的方法 有没有人遇到过类似的问题 产生的结果 <?xml version="1.0" encoding="UTF-8"?> <Test xmlns:date="http://exslt.org/dates-and-times" version="1.0"> 2019

在执行xslt转换时,时区以一种奇怪的方式序列化

我尝试在xalan和jaxen之间切换实现,但没有观察到任何变化

尝试手动设置日期格式,但似乎找不到使用该格式添加时区(例如+05:30或-08:00)的方法

有没有人遇到过类似的问题

产生的结果

<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns:date="http://exslt.org/dates-and-times" version="1.0">
    2019-06-20T10:23:31+05:1800000
</Test>
input.xml

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

获得2019-06-20T10:23:31+05:1800000的原因是xalan的ExsltDatetime实现将GMT偏移量与DST偏移量(5.5小时)相加。 但是,当以小时和分钟为单位计算偏移量时,xalan实现中似乎存在一个bug

要在xalan的ExsltDatetime类中偏移的代码:

int offset = cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET);
// If there is no offset, we have "Coordinated
// Universal Time."
if (offset == 0)
    buff.append('Z');
 else {
    // Convert milliseconds to hours and minutes
     int hrs = offset/(60*60*1000);
     // In a few cases, the time zone may be +/-hh:30.
      int min = offset%(60*60*1000);
      char posneg = hrs < 0? '-': '+';
      buff.append(posneg + formatDigits(hrs) + ':' + formatDigits(min));
  }
int offset=cal.get(Calendar.ZONE_offset)+cal.get(Calendar.DST_offset);
//如果没有补偿,我们就“协调”
//世界时间。”
如果(偏移量==0)
buff.append('Z');
否则{
//将毫秒转换为小时和分钟
整数小时=偏移量/(60*60*1000);
//在少数情况下,时区可能为+/-hh:30。
int min=偏移量%(60*60*1000);
char posneg=hrs<0?'-':'+';
buff.append(posneg+formatDigits(hrs)+':'+formatDigits(min));
}
上述代码给出的小时偏移量为5,这是好的,但分钟偏移量计算为1800000,这是不正确的

else部分应根据剩余偏移量正确计算分钟数,如下所示:

  // Convert milliseconds to hours and minutes
  int hrs = offset/(60*60*1000);
  // In a few cases, the time zone may be +/-hh:30.
  //get the remaining offset in ms
  offset -= (hrs*60*60*1000);
  //convert remaining offset into minutes
  int min = offset/(60*1000);
  char posneg = hrs < 0? '-': '+';
  buff.append(posneg + formatDigits(hrs) + ':' + formatDigits(min));
//将毫秒转换为小时和分钟
整数小时=偏移量/(60*60*1000);
//在少数情况下,时区可能为+/-hh:30。
//获取以毫秒为单位的剩余偏移量
偏移量-=(小时*60*60*1000);
//将剩余偏移量转换为分钟
int min=偏移量/(60*1000);
char posneg=hrs<0?'-':'+';
buff.append(posneg+formatDigits(hrs)+':'+formatDigits(min));
以上是正确的代码,它正确地将分钟返回为30

要对XSLT中的当前日期使用不同/简单的日期格式化程序,可以使用:

<Test version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:date="xalan://java.text.SimpleDateFormat"
        xmlns:java="http://xml.apache.org/xslt/java">
               <xsl:variable name="iso-date"
                select='date:new("yyyy-MM-dd&apos;T&apos;hh:mm:ssXXX")' />
    <xsl:value-of select="java:format($iso-date, java:java.util.Date.new())"/>
</Test>


您也可以尝试

FYI,小时数分钟秒,例如
+05:30
不是时区,它只是UTC的偏移量。该示例比UTC早五个半小时。时区的含义远不止于此:一个特定地区的人们使用的补偿的过去、现在和未来变化的历史。时区名称的格式为
大陆/地区
,例如:
美国/蒙特利尔
太平洋/奥克兰
。作为时区和历史的一个例子,
亚洲/加尔各答
是印度的一个时区,其偏移量目前为
+05:30
,但有。
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.4.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile 'jaxen:jaxen'
    testCompile("junit:junit")
    compile group: 'xalan', name: 'xalan', version: '2.7.2'


    compile group: 'xmlunit', name: 'xmlunit', version: '1.6'

    compile group: 'org.apache.avro', name: 'avro', version: '1.9.0'

}
int offset = cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET);
// If there is no offset, we have "Coordinated
// Universal Time."
if (offset == 0)
    buff.append('Z');
 else {
    // Convert milliseconds to hours and minutes
     int hrs = offset/(60*60*1000);
     // In a few cases, the time zone may be +/-hh:30.
      int min = offset%(60*60*1000);
      char posneg = hrs < 0? '-': '+';
      buff.append(posneg + formatDigits(hrs) + ':' + formatDigits(min));
  }
  // Convert milliseconds to hours and minutes
  int hrs = offset/(60*60*1000);
  // In a few cases, the time zone may be +/-hh:30.
  //get the remaining offset in ms
  offset -= (hrs*60*60*1000);
  //convert remaining offset into minutes
  int min = offset/(60*1000);
  char posneg = hrs < 0? '-': '+';
  buff.append(posneg + formatDigits(hrs) + ':' + formatDigits(min));
<Test version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:date="xalan://java.text.SimpleDateFormat"
        xmlns:java="http://xml.apache.org/xslt/java">
               <xsl:variable name="iso-date"
                select='date:new("yyyy-MM-dd&apos;T&apos;hh:mm:ssXXX")' />
    <xsl:value-of select="java:format($iso-date, java:java.util.Date.new())"/>
</Test>