ユーザがデータベースデータをアップロードするシナリオがあります。ユーザーは、データベースからjavaオブジェクトにデータを読み取り、javaオブジェクトをファイルにシリアライズします。このファイルは、リモートサーバーにアップロードされます。リモートサーバーでは、このファイルをデシリアライズしてリモートサーバー上のデータベースに格納します。タイムスタンプを含むオブジェクトのデシリアライズ
タイムスタンプと日付を逆シリアル化すると問題が発生します。タイムスタンプは、クライアントシステム上のタイムスタンプとは異なります。私たちは、問題をクライアントシステム上のタイムゾーンが間違って設定されたものに戻しました。クライアントは太平洋時間米国とカナダ(UTC - 8:00)で、サーバーはインド時間(UTC + 5:30)にありました。したがって、データベースがデータを挿入したとき、それは時間差を補償した。私たちはクライアントシステム上で間違って設定されたタイムゾーンを変更しましたが、今はすべて正常です。
しかし、私たちはすべてのクライアントシステムを制御できません。彼らが異なるタイムゾーンにいる場合(システムに正しく設定されていない場合)、サーバーはデータを補正して保存しないように指示する方法を教えてください。つまり、デシリアライズは、ユーザーが送信したデータをDBに格納する必要があります。
また、サーバーを別のタイムゾーンに移動すると、問題はすべてのユーザーに現れます。
我々は、Javaを使用して、データベースはMySQLの
あるEDIT:
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:ここでのサンプルコードです、それが最初に作成されたタイムゾーンに戻す日付を変換するためには、Iタイムゾーンをシリアルに送信するようにコードを変更しました。今の時間帯は、最初のシリアライズされたオブジェクトであり、DBObjectを今、私はresonctructedオブジェクトに変更しようとしているシリアル化されたタイムゾーンを使用して..秒1である:
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
問題がシリアル化またはデータベースに存在するかどうかは不明ですし、関係する種類の表示。それは答えを与えることを非常に難しくします。 –
ちょうど推測:ミリ秒単位で日付を保存する(Long型)? –