0

異なるタイムゾーンのマシンとの間で、RMI を介して java.util.Date オブジェクトを送信する際に問題が発生しています。

たとえば、ドイツのクライアントは日付オブジェクトを英国のサーバーに送信します。

  1. ユーザーは、20090220 などの日付文字列を入力します。
  2. ドイツのクライアント アプリは、SimpleDateFormat("yyyyMMdd") を使用して日付に変換し、次のように指定します: Fri Feb 20 00:00:00 CET 2009
  3. 英国のサーバーは、RMI 経由で日付を次のように受信します: Thu Feb 19 23:00:00 GMT 2009
  4. サーバーは日付を英国のOracleデータベースのDATE列に格納します

この間違った日付の問題を回避する最善の方法は何ですか? 日付文字列を送信してサーバーに日付に変換させることもできますが、サーバーが実行する必要がある作業の量を減らしたいと考えています。

以下は、日付のシリアル化を示すスタンドアロンのテスト プログラムです。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class SerializationTest {

    public static void main(String[] args) throws Exception {

        final String yyyyMMdd = "20090220";
        final Date date = new SimpleDateFormat("yyyyMMdd").parse(yyyyMMdd);

        if (args.length != 1) {
            System.out.println("Usage SerializationTest S|D");
        }

        boolean serialise = false;
        if (args[0].equals("S")) {
            serialise = true;
        }
        else if (args[0].equals("D")) {
            serialise = false;
        }

        String filename = "date.ser";
        if (serialise) {
            // write the object to file
            FileOutputStream fos = new FileOutputStream(filename);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            ObjectOutputStream outputStream = new ObjectOutputStream(bos);
            outputStream.writeObject(date);
            outputStream.flush();
            outputStream.close();

            System.out.println("Serialised: " + date);
        }
        else {
            FileInputStream fis = new FileInputStream(filename);
            BufferedInputStream bis = new BufferedInputStream(fis);
            ObjectInputStream inputStream = new ObjectInputStream(bis);
            Date outDate = (Date) inputStream.readObject();
            inputStream.close();

            // print the object
            System.out.println(outDate);
        }
    }
}
4

3 に答える 3

2

ここであなたの問題が何であるかわかりません。これらの日付は私には正しいように見えます-使用中のロケールに合わせてフォーマットされているだけです. ユーザーが入力した日付を GMT にしたい場合は、SimpleDateFormat コンストラクターでロケールを指定します。

于 2009-02-23T17:11:48.070 に答える
0

java.util.Calendar、特に getTime() メソッドを見てください。

そうすれば、さまざまな方法で解釈可能な文字列ではなく、ミリ秒単位で時間を送信できます。

于 2009-02-23T17:33:05.053 に答える
0

getTime() と setTime() を見てください。彼らはあなたが探していることをするべきです。場所固有の文字列としてネットワーク経由で送信する代わりに、クライアントで getTime() を使用してエポックからのミリ秒数として送信し、クライアントで新しい Date を作成し、setTime() で long 値を使用します。サーバ。

于 2009-02-23T17:15:35.160 に答える