gpt4 book ai didi

datetime - 如果秒为 00,java.time.LocalDateTime 转换问题

转载 作者:行者123 更新时间:2023-12-02 22:04:14 24 4
gpt4 key购买 nike

我的 Web 应用程序正在使用 Apache CXF 和 JAVA8,如果用户发送 xs:datetime ,则会在响应中面临以下错误输入(秒 00)为

<urn1:dateTimeVal>2016-04-29T20:00:00</urn1:dateTimeVal>

错误:

org.apache.cxf.interceptor.Fault: Marshalling Error: cvc-datatype-valid.1.2.1: '2016-04-29T20:00' is not a valid value for 'dateTime'.

我调试分析,如果用户发送dateTimeVal2016-04-29T20:00:00然后输入的 CXF 验证通过,XML 值UnMarshaledjava.time.LocalDateTime2016-05-05T20:00 ,并且在返回响应时,由于秒部分(00)丢失而发生编码错误。

任何帮助/提示表示赞赏。

P.S:您可以尝试使用以下代码片段:

   java.time.LocalDateTime dt= java.time.LocalDateTime.of(2016, Month.MAY, 5, 20, 00, 00);
System.out.println(dt);

注意:以上代码示例仅用于理解打印日期时间值。但 Web 应用程序中预期的实际返回类型是 java.time.LocalDateTime

预期输出:2016-05-05T20:00:00

实际产出:2016-05-05T20:00

编辑:该字段的绑定(bind)(JAXB)内容是:

 @XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
@XmlSchemaType(name = "dateTime")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2016-05-03T05:28:57+05:30", comments = "JAXB RI v2.2.11")
@NotNull
protected LocalDateTime dateTimeVal;

LocalDateTimeAdapter文件是

 import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAccessor;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class LocalDateTimeAdapter
extends XmlAdapter<String, LocalDateTime>
{
public static LocalDateTime parse(String value)
{
DateTimeFormatter dateTimeAndZoneformatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
DateTimeFormatter dateTimeformatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
TemporalAccessor ta = null;
try
{
ta = dateTimeformatter.parse(value);
}
catch (DateTimeParseException ex)
{
ta = dateTimeAndZoneformatter.parse(value);
}
return LocalDateTime.from(ta);
}

public static String print(LocalDateTime value)
{
return value.toString();
}

public LocalDateTime unmarshal(String value)
{
return parse(value);
}

public String marshal(LocalDateTime value)
{
return print(value);
}
}

最佳答案

问题似乎出在 LocalDateTimeAdapter.print() 中。 LocalDateTime.toString() 当秒值为 0 时省略秒。

如果你把它改成

public static String print(LocalDateTime value)
{
return value.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}

它在编码时也会提供秒数。

要查看快速示例,请注意以下代码段的结果:

System.out.println(LocalDateTime.of(2016,1,1,0,0,0,0).toString());
System.out.println(LocalDateTime.of(2016,1,1,0,0,0,0).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

它给出的输出是

2016-01-01T00:00
2016-01-01T00:00:00

LocalDateTime.toString() 的文档中,它解释了此行为:

The output will be one of the following ISO-8601 formats:
- uuuu-MM-dd'T'HH:mm
- uuuu-MM-dd'T'HH:mm:ss
- uuuu-MM-dd'T'HH:mm:ss.SSS
- uuuu-MM-dd'T'HH:mm:ss.SSSSSS
- uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS
The format used will be the shortest that outputs the full value of the time where the omitted parts are implied to be zero.

关于datetime - 如果秒为 00,java.time.LocalDateTime 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37024797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com