異なるタイムゾーンのマシンとの間で、RMI を介して java.util.Date オブジェクトを送信する際に問題が発生しています。
たとえば、ドイツのクライアントは日付オブジェクトを英国のサーバーに送信します。
- ユーザーは、20090220 などの日付文字列を入力します。
- ドイツのクライアント アプリは、SimpleDateFormat("yyyyMMdd") を使用して日付に変換し、次のように指定します: Fri Feb 20 00:00:00 CET 2009
- 英国のサーバーは、RMI 経由で日付を次のように受信します: Thu Feb 19 23:00:00 GMT 2009
- サーバーは日付を英国の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);
}
}
}