Java 在不同区域的计算机之间通过RMI发送日期
我在通过RMI向不同时区的机器发送java.util.Date对象时遇到问题 例如,德国的客户机将向英国的服务器发送日期对象Java 在不同区域的计算机之间通过RMI发送日期,java,rmi,Java,Rmi,我在通过RMI向不同时区的机器发送java.util.Date对象时遇到问题 例如,德国的客户机将向英国的服务器发送日期对象 用户输入日期字符串,例如20090220 德国的客户端应用程序使用SimpleDateFormat(“yyyyMMdd”)将其转换为日期,给出:2009年2月20日星期五00:00:00 CET 英国服务器通过RMI接收日期为:2009年2月19日星期四23:00:00 GMT 服务器将日期存储到英国Oracle数据库的日期列中 解决这个日期不正确问题的最佳方法是什么?
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);
}
}
}
我看不出你的问题出在这里,这些日期在我看来是正确的-它们只是被格式化为正在使用的语言环境。如果希望用户输入的日期以GMT为单位,请在SimpleDataFormat构造函数上指定区域设置查看getTime()和setTime()。他们应该做你想做的事。在客户端上使用getTime()将其作为自历元起的毫秒数发送,然后在客户端上构建一个新日期,并在服务器上使用setTime()和long值,而不是作为特定于位置的字符串通过线路发送。查看java.util.Calendar,特别是getTime()方法
这样,您将以毫秒为单位发送时间,而不是以不同方式解释的字符串。我不会将其作为“位置特定字符串”发送,而是作为java.util.Date对象发送。我已尝试发送毫秒数,但当我在服务器上创建日期对象并调用setTime时,它仍会给出Thu Feb 19,而不是Fri Feb 20。将同样长的时间发送回客户端时,在其区域设置中格式化时,应显示Fri Feb 20,而不管服务器值如何。如果您需要通过服务器端的管理UI修改它,您必须使用时区数学,而我已经多年没有编写Java了,因此我无法在这方面帮助您。您不必使用时区数学,只需设置正确的区域设置,它将正确格式化。问题是我的服务器在我的数据库中存储了错误的日期。我得到的不是2009年2月20日,而是2009年2月19日。(我的数据库列是java.sql.Types.DATE)我所说的话仍然有效。数据库中的日期应存储在单个时区(最好是GMT)-只需在存储日期之前将日期转换为该时区2009年2月20日星期五00:00:00 CET与2009年2月19日星期四23:00:00 GMT完全相等。没有日期差异。我知道日期是相等的。当我试图将date对象放入数据库的date列(而不是DATETIME)时,会出现这种差异。它将导致2009年2月19日而不是2009年2月20日!