Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson反序列化JS日期?_Java_Json_Datetime_Jackson - Fatal编程技术网

Java 如何使用Jackson反序列化JS日期?

Java 如何使用Jackson反序列化JS日期?,java,json,datetime,jackson,Java,Json,Datetime,Jackson,我从ExtJS获取一个日期字符串,格式如下: “2011-04-08T09:00:00” 当我尝试反序列化这个日期时,它会将时区更改为印度标准时间(时间加上+5:30)。这就是我反序列化日期的方式: SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

我从ExtJS获取一个日期字符串,格式如下:

“2011-04-08T09:00:00”

当我尝试反序列化这个日期时,它会将时区更改为印度标准时间(时间加上+5:30)。这就是我反序列化日期的方式:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
这样做也不会改变时区。我仍然在IST中获得日期:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

如何以不受时区干扰的方式反序列化日期?

我找到了一个解决方法,但有了这个方法,我需要在整个项目中注释每个日期的设置器。在创建ObjectMapper时,是否有一种方法可以指定格式

以下是我所做的:

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

    }

}

这对我很有用-我正在使用jackson 2.0.4

ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);
此外,这是我提出的Java 8变体,它使用Java.time.LocalDate和ZonedDateTime,而不是旧的Java.util.Date类

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

    @Override
    public LocalDate deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException {

        String string = jsonparser.getText();

        if(string.length() > 20) {
            ZonedDateTime zonedDateTime = ZonedDateTime.parse(string);
            return zonedDateTime.toLocalDate();
        }

        return LocalDate.parse(string);
    }
  }
公共类LocalDateDeserializer扩展JsonDeserializer{
@凌驾
公共LocalDate反序列化(JsonParser JsonParser,DeserializationContext DeserializationContext)引发IOException异常{
String String=jsonparser.getText();
if(string.length()>20){
ZonedDateTime ZonedDateTime=ZonedDateTime.parse(字符串);
返回zonedDateTime.toLocalDate();
}
返回LocalDate.parse(字符串);
}
}

关于这个话题有一个很好的博客: 使用@JsonFormat看起来是最简单的方法

public class Event {
    public String name;

    @JsonFormat
      (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    public Date eventDate;
}

@JsonFormat仅适用于您正在使用的jackson版本支持的标准格式


例如:-兼容jackson 2.8.6的任何标准格式(“yyyy-MM-dd'HH:MM:ss.SSSZ”,“yyyy-MM-dd'HH:MM:ss.SSS'Z'”,“EEE,dd-MM-MM yyyy:MM:ss-zzz”,“YY-MM-dd”))格式中的“T”是什么,不应该是“yyyy-MM-dd-HH:MM:ss”吗?这是一个有效的日期时间模式。例如,即使是'HH:MM:ss z处的
yyyy.MM.dd G'和
HH'o''clock'a,zzzzzz
也是有效的模式。“T”的格式是,因为它使用的是ISO 8601日期-时间格式标准。显然,您不需要使用ISO标准格式,但在使用第三方库(如ExtJS)时,它有助于提高兼容性@不,这真的是错的。由于SimpleDataFormatter不是线程安全的,而且jackons缓存根级别的反序列化程序(这不能被禁用),您必须按照Varun Achar的建议为每个日期使用不同的SimpleDataFormatter,或者同步反序列化方法,因为您使用的是SimpleDataFormatter字段。这个字段不能是静态的。这是我见过的最恶心的虫子之一。这很有帮助,非常感谢。因为我使用的是Java 8,所以我发布了一个使用LocalDate的答案,请参见。或者,我使用了新的ISO8601DateFormat(),它与大多数其他语言的默认值(C#、Ruby等)是内联的。setDateFormat是否已被弃用?我是jackson的新手,我想知道在哪里添加上述代码?'objectMapper.setDateFormat(df);'如果您只有一个实用工具或一个唯一的bean来设置格式,那么这是很好的,否则您必须始终记住在使用它的任何地方设置它。此外,DateFormat不是线程安全的<代码>对象映射器
是线程安全的。对于每个配置,您只需要它的一个实例,即,如果您需要2种不同的日期格式,那么您需要2个
ObjectMapper
对象,或者只有一个,但您需要同步对
setDateFormat
方法的调用。您可以配置并使用Jackson的方法,而不是编写自己的反序列化程序。
public class Event {
    public String name;

    @JsonFormat
      (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    public Date eventDate;
}