当前位置: 首页 > 知识库问答 >
问题:

Java-Date将该日期随机序列化和反序列化一天

颜英博
2023-03-14

我在生产中遇到了一个奇怪的问题:一个Java.util.日期字段随机减少了一天总数。这种情况很少发生,但有时会出问题,生产中日期会减少。

尝试创建自定义序列化程序和反序列化程序没有帮助。

以下是代码:

// UserData class

package mypackage;

import myotherpackage.DataDefaultPatternDeserializer;
import myotherpackage.DataDefaultPatternSerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import java.util.Date;

@Data
public class UserData {
    //Random problems in production - date decreased by one day
    @JsonSerialize(using = DataDefaultPatternSerializer.class)
    @JsonDeserialize(using = DataDefaultPatternDeserializer.class)
    private Date dateOfBirth;
}


// ----------------------------------------------------------------------------------------
// DataDefaultPatternSerializer class

package myotherpackage;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DataDefaultPatternSerializer extends JsonSerializer<Date> {
    public DataDefaultPatternSerializer() {
    }

    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd").withLocale(Locale.ITALY);
        jsonGenerator.writeString(formatter.print(new DateTime(date)));
    }
}


// ----------------------------------------------------------------------------------------
// DataDefaultPatternDeserializer class

package myotherpackage;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DataDefaultPatternDeserializer extends JsonDeserializer<Date> {
    public DataDefaultPatternDeserializer() {
    }

    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd").withLocale(Locale.ITALY);
        String dateString = jsonParser.getText();
        return formatter.parseDateTime(dateString).toDate();
    }
}

有解决办法吗?

共有1个答案

夔修伟
2023-03-14

切勿使用任何一种Dateclass。这些糟糕的类在几年前被现代java所取代。JSR 310中定义的时间类。

还有,java。util。日期表示一个时刻,一个以UTC为单位的日期,其时间偏移量为零分秒。您试图将仅限日期的值(出生日期)与UTC类型的带时间的日期相匹配。

对于出生日期,请使用仅限日期的类型,LocalDate

LocalDate ld = LocalDate.parse( "1969-01-23" ) ;

要生成标准ISO 8601格式的文本,请调用toString

String outputISO8601 = ld.toString() ;

将日期-时间值序列化为文本时,请使用ISO 8601格式。

Jackson支持java.time类型。

要向数据库写入类型类似于SQL标准类型DATE的列:

myPreparedStatement.setObject( … , ld ) ; 

检索。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
 类似资料:
  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并

  • 上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能

  • 奇怪的是下面的测试用例会失败。有人知道为什么吗?

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加

  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行: