我在通过RMI向往返于不同时区的计算机上发送java.util.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);
}
}
}
答案 0 :(得分:2)
我没有看到你的问题在这里,那些日期对我来说是正确的 - 他们只是被格式化为正在使用的语言环境。如果您希望用户输入的日期为GMT,请在SimpleDateFormat构造函数上指定区域设置
答案 1 :(得分:0)
查看getTime()和setTime()。他们应该做你想要的。不是通过线路将其作为特定于位置的字符串发送,而是使用客户端上的getTime()将其作为epoch以来的毫秒数发送,然后在客户端上构建新的Date并使用带有long值的setTime()服务器
答案 2 :(得分:0)
特别是看看java.util.Calendar的getTime()方法。
通过这种方式,您将以毫秒为单位发送时间而不是以不同方式解释的字符串。