Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >Java - Date减少了一天随机序列化和反序列化该日期。

Java - Date减少了一天随机序列化和反序列化该日期。
EN

Stack Overflow用户
提问于 2022-03-18 06:40:06
回答 1查看 259关注 0票数 0

我在生产中有一个奇怪的问题:有一天,Java.util.Date字段被完全随机地减少了。It 很少发生,但有时出了问题,生产中的日期减少了。

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

以下是代码:

代码语言:javascript
代码运行次数:0
复制
// 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();
    }
}

有解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-18 07:03:43

错误类型

不要使用任何一个Date类。这些可怕的类几年前被定义在JSR 310中的现代java.time类所取代。

此外,java.util.Date代表的是一个时刻,一天中时间的日期,如UTC所见,其偏移量为零点击-分钟-秒.你试着把一个日期值(出生日期)放进一个有时间的UTC类型中.

时区

出现在您的java.util.Date上的日期和时间发生变化的原因是,该类有许多设计缺陷,其中一个toString方法在生成文本时动态地应用JVM当前的默认时区。当将一个时刻调整到另一个时区时,一天的时间甚至日期都可能“改变”。现在,在我写这篇文章的时候,它是“明日”在日本东京,同时也是“昨天”在美国俄亥俄州的托莱多

日本东京,2022-03-19星期六上午05:53:08 美国俄亥俄州托莱多今天下午04:53:08在2022-03-18星期五

解决此问题的最佳解决方案是:(a)不使用遗留的java.util.Date类;(b)不使用UTC中有时间的日期类型来表示仅日期的值。

java.time.LocalDate

对于出生日期,只使用日期类型LocalDate

代码语言:javascript
代码运行次数:0
复制
LocalDate ld = LocalDate.parse( "1969-01-23" ) ;

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

代码语言:javascript
代码运行次数:0
复制
String outputISO8601 = ld.toString() ;

串行化

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

Jackson支持java.time类型。

数据库

在类似SQL标准类型DATE的类型的列中写入数据库。

代码语言:javascript
代码运行次数:0
复制
myPreparedStatement.setObject(, ld ) ; 

检索。

代码语言:javascript
代码运行次数:0
复制
LocalDate ld = myResultSet.getObject(, LocalDate.class ) ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71528721

复制
相关文章
Java序列化和反序列化,你该知道得更多
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象——百度词条解释。
用户1615728
2019/05/07
6190
Java序列化和反序列化,你该知道得更多
spring-boot:对日期(Date)类型数据的序列化
spring将Java 数据类型的序列和反序列化为JSON字符串是依赖jackson(com.fasterxml.jackson.core:jackson-core)库来实现的,对于Java Bean中的Date类型字段,可以使用@JsonFormat注释来指定日期格式,示例如下:
10km
2022/06/07
2.8K0
Java序列化和反序列化
Java序列化(Serialize)是指将一个Java对象写入IO流中; Java反序列化(Deserialize)指的是从IO流中回复IO对象。
悠扬前奏
2019/05/28
8840
java序列化和反序列化
Java序列化和反序列化是将Java对象转换为字节流和将字节流转换为Java对象的过程。Java提供了一种机制,称为Java对象序列化,可将Java对象转换为字节流,以便将其保存在文件中或通过网络传输。反序列化是将字节流转换回Java对象的过程。在本文中,我们将探讨Java序列化和反序列化的基本原理以及如何使用Java进行序列化和反序列化。
堕落飞鸟
2023/03/31
9360
Java 对象序列化和反序列化
     之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行
Single
2018/01/04
9540
Java对象的序列化和反序列化
Java 对象的序列化和反序列化是一种将对象转换成字节流并存储在硬盘或网络中,以及从字节流中重新加载对象的操作。Java 的序列化和反序列化提供了一种方便的方式,使得可以将对象在不同的应用程序之间进行交互。
阿珍
2023/04/18
1.4K0
Java-json序列化和反序列化
java开发中经常会遇到json的序列化与反序列化,常用的json序列化工具有阿里的Fastjson、spring mvc内置的Jackson、还有就是我们接下来要说的谷歌的Gson。
Vincent-yuan
2021/04/01
4.7K0
java序列化和序列化ID的作用
谈到java序列化其实大家都能说出一二, java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化当然就是对对象的重建。
Tim在路上
2020/08/04
1.4K0
理解Java里面的序列化和反序列化
(一)什么是序列化和反序列化 序列化和反序列化是将对象转化成字节数组以方便保存或者用于网络传输,这个对象可以是一个图片,一个字符串,一个class等等,常见序列化格式有字节数组,json格式,xml格式,更加高效的有google开源的Protocol Buffers,以及Apache Avro。 (二)为什么需要序列化和反序列化 (1)实现数据持久化,一般jvm的里面数据,在java程序退出时,所有的状态都不会保留,通过序列化可以将需要的数据给持久化到磁盘文件或者数据库,这样就可以在下次jvm启动的时候再把
我是攻城师
2018/05/14
1.1K0
java 的序列化和反序列化的问题
引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写。然而在有些情况下,光知道这些还远远不够,文章列举了笔者遇到的一些真实情境,它们与 Java 序列化相关,通过分析情境出现的原因,使读者轻松牢记 Java 序列化中的一些高级认识。 回页首 文章结构 本文
xiangzhihong
2018/01/30
9080
java 的序列化和反序列化的问题
Java对象的序列化和反序列化 转
把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。   对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;   2) 在网络上传送对象的字节序列。
wuweixiang
2018/08/14
7120
Java中的JSON序列化和反序列化
JSON 起源于 1999 年的 JS 语言规范 ECMA262 的一个子集,后来 2003 年作为一个数据格式ECMA404(404???)发布。 2006 年,作为 rfc4627 发布,这时规范增加到 18 页,去掉没用的部分,十页不到。
鱼找水需要时间
2023/03/23
2.3K0
Java中的JSON序列化和反序列化
Java对象的序列化(Serialization)和反序列化详解
####1.序列化和反序列化 序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者XML等格式;而字节或者XML格式的可以还原成完全相等的对象,这个相反的过程又称为反序列化;
全栈程序员站长
2022/07/04
6970
Java原生序列化和Kryo序列化性能比较
最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:
用户1205080
2019/03/12
1.5K0
Python序列化-序列化和反序列化
使用 JSON 模块将 Python 对象转换为 JSON 格式的字符串非常简单,只需调用 json.dumps() 函数并传递要序列化的 Python 对象即可。以下是示例代码:
玖叁叁
2023/04/18
7220
序列化和反序列化
一、序列化: 就是将内存中的对象转换为字节序列,方便持久化到磁盘或者网络传输 SerializeToString(): serializes the message and returns it as a string. Note that the bytes are binary, not text; we only use the str type as a convenient container. 二、反序列化: 就是将字节序列转换为内存中的对象 ParseFromString(data): p
Leophen
2019/09/23
9050
Java对象的序列化和反序列化是什么?
Java对象的序列化和反序列化是Java中常用的一种数据持久化方式。简单地说,序列化是将一个Java对象转换为字节流的过程,而反序列化则是将字节流转换回Java对象的过程。 Java对象序列化的主要目的是将对象转换为字节流,以便在网络上传输或将对象持久化到本地磁盘上。当一个Java对象被序列化后,它的所有属性和成员变量的值都被转换成字节流,并可以通过网络或者存储到本地磁盘上。由于Java对象序列化后可以被传输和存储,因此它在分布式系统和网络编程中扮演着非常重要的角色。
用户1289394
2023/08/22
2270
Java对象的序列化和反序列化是什么?
【java筑基】IO流进阶之文件随机访问、序列化与反序列化
RandomAccessFile支持对于文件的随机访问(而不是只能从头开始读写),创建RandomAccessFile对象时需要传入mode参数,该参数有4个值:r(read), rw(read,write), rws(read, write and store data and file into device memory),rwd((read, write and store file into device memory).
半旧518
2022/10/26
2000
【java筑基】IO流进阶之文件随机访问、序列化与反序列化
点击加载更多

相似问题

Java (反)序列化过程

12

MySQL str_to_date在Datagrip中返回日期减一天

124

序列化java.util.Date

20

在Java中将日期序列化和反序列化为Bean

12

Javascript和Java日期JSON序列化

616
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文