我们有一个用户上传数据库数据的场景。用户将数据从数据库读取到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
答案 0 :(得分:1)
我会将所有时间戳存储为服务器和客户端上的GMT。我只在显示时间时将其更改为用户首选的时区。这样可以避免混淆用于存储或检索日期/时间的时区,以及是否正确等等。
答案 1 :(得分:0)
您可以在DBObject
上添加时区信息,因为TimeZone
类是可序列化的。要获取当前的TimeZone,只需使用Calendar.getInstance().getTimeZone()
。