在不同地区的机器之间发送日期超过RMI

时间:2009-02-23 17:03:41

标签: java rmi

我在通过RMI向往返于不同时区的计算机上发送java.util.Date对象时遇到问题。

例如,德国的客户将向英国的服务器发送日期对象。

  1. 用户输入日期字符串,例如20090220。
  2. 德国的客户端应用程序使用SimpleDateFormat(“yyyyMMdd”)将其转换为日期:2月20日星期五00:00:00 CET 2009
  3. 英国服务器收到RMI日期为:2009年2月19日23:00:00 GMT 2009
  4. 服务器将日期存储到英国Oracle数据库日期列
  5. 解决这个错误日期问题的最佳方法是什么? 我可以发送日期字符串并让服务器将其转换为日期,但我想减少服务器必须执行的工作量。

    这是一个显示日期序列化的独立测试程序:

    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);
            }
        }
    }
    

3 个答案:

答案 0 :(得分:2)

我没有看到你的问题在这里,那些日期对我来说是正确的 - 他们只是被格式化为正在使用的语言环境。如果您希望用户输入的日期为GMT,请在SimpleDateFormat构造函数上指定区域设置

答案 1 :(得分:0)

查看getTime()和setTime()。他们应该做你想要的。不是通过线路将其作为特定于位置的字符串发送,而是使用客户端上的getTime()将其作为epoch以来的毫秒数发送,然后在客户端上构建新的Date并使用带有long值的setTime()服务器

答案 2 :(得分:0)

特别是看看java.util.Calendar的getTime()方法。

通过这种方式,您将以毫秒为单位发送时间而不是以不同方式解释的字符串。