2011-12-07 20 views
2

ユーザがデータベースデータをアップロードするシナリオがあります。ユーザーは、データベースから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 
+1

問題がシリアル化またはデータベースに存在するかどうかは不明ですし、関係する種類の表示。それは答えを与えることを非常に難しくします。 –

+0

ちょうど推測:ミリ秒単位で日付を保存する(Long型)? –

答えて

0

TimeZoneクラスが直列化可能であるので、あなたにもあなたのDBObjectのタイムゾーン情報を追加することができます。現在のTimeZoneを取得するには、Calendar.getInstance().getTimeZone()を使用してください。

+0

私はそれを試みました。私は別のフィールドとしてタイムゾーンを追加し、同じサーバー上で取得しました。しかし、私はそれを非直列化タイムスタンプにどのように適用するのですか?私はそれに苦しんでいます。あなたはあなたの答えを編集して助けてください、そして、小さなコードスニペットを投稿してください。 – sethu

1

すべてのタイムスタンプをGMTとしてサーバーとクライアントに保存します。時間を表示するときには、ユーザーの優先時間帯に変更するだけです。これにより、日付/時刻を保存または取得するために使用されたタイムゾーンが混乱するのを避けることができます。

関連する問題