gpt4 book ai didi

java - 反序列化包含时间戳的对象

转载 作者:行者123 更新时间:2023-11-29 03:11:00 29 4
gpt4 key购买 nike

我们有一个用户上传数据库数据的场景。用户从数据库中读取数据到 java 对象,然后将 java 对象序列化到文件中。然后将此文件上传到远程服务器。在远程服务器上,我反序列化该文件并将其放入远程服务器上的数据库中。

当我反序列化时间戳和日期时出现问题。与客户端系统上的时间戳相比,时间戳不同。我们将问题追溯到客户端系统上错误设置的时区。客户端使用美国和加拿大太平洋时间(UTC - 8:00),服务器使用印度时间(UTC + 5:30)。因此,当数据库插入数据时,它会补偿时间差。我们更改了客户端系统上错误设置的时区,现在一切正常。

但我们无法控制所有客户端系统。如果他们在不同的时区(在他们的系统上设置不正确)那么我们如何指示服务器不补偿并按原样存储数据。这意味着反序列化应该将数据完全按照用户发送的那样放入数据库中。

此外,如果我们将服务器移动到不同的时区,那么所有用户都会出现问题。

我们用的是java,数据库是mysql

编辑:这是一个代码示例:

public class Test
{
public static void main(String[] args) {
try {
DBObject db = new DBObject();
db.setTs(new Timestamp(System.currentTimeMillis()));

//first save the data on one timezone
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("/Users/Sethu/temp/test.dat"));
os.writeObject(db);
os.close();

//comment the top portion of saving.. change the timezone and run the code,
//you will see a different date appearing in your screen
ObjectInputStream is=new ObjectInputStream(new FileInputStream("/Users/Sethu/temp/test.dat"));
DBObject dbin=(DBObject)is.readObject();
System.out.println(dbin.getTs());
} catch (Exception e) {
e.printStackTrace();
}

}
}

class DBObject implements Serializable{
private Timestamp ts;

public Timestamp getTs() {
return ts;
}

public void setTs(Timestamp ts) {
this.ts = ts;
}

}

编辑 2:为了将日期转换回最初创建时区,我现在更改了代码以发送序列化的时区。现在时区是第一个序列化对象,而 DBObject 是第二个。现在使用序列化时区,我正在尝试更改重构对象:

System.out.println("Current Timezone="+DateTimeZone.getDefault());
DateTimeZone timezone=(DateTimeZone)is.readObject();
System.out.println("Timezone of saved object="+timezone);
DBObject dbin=(DBObject)is.readObject();
System.out.println("Date in current timezone="+dbin.getTs());

System.out.println("Date time Object in timezone of saved object="+new DateTime(dbin.getTs()).withZone(timezone));

//This is where the issue is.. As soon as I do this, I get the date in the current timezone again..
System.out.println("Date time exported to date="+new DateTime(dbin.getTs()).withZone(timezone).toDate());

当我这样做时,这就是我得到的输出!

Current Timezone=America/Los_Angeles
Timezone of saved object=+05:30
Date in current timezone=Tue Dec 06 23:30:56 PST 2011
Date time Object in timezone of saved object=2011-12-07T13:00:56.687+05:30
Date time exported to date=Tue Dec 06 23:30:56 PST 2011

最佳答案

我会将所有时间戳存储为服务器和客户端上的 GMT。我只是在显示时间的时候改成用户喜欢的时区。这避免混淆使用哪个时区来存储或检索日期/时间以及它是否正确等。

关于java - 反序列化包含时间戳的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8411376/

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