【发布时间】:2023-10-20 16:33:01
【问题描述】:
我在通过 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);
}
}
}
【问题讨论】:
-
2009 年 2 月 20 日星期五 00:00:00 CET 正好等于 2009 年 2 月 19 日星期四 23:00:00 GMT 2009。不存在日期差异。
-
我知道日期是相等的。当我尝试将日期对象放入数据库的 DATE 列(不是 DATETIME)时,就会出现差异。它导致 19/2/2009 而不是 20/2/2009!