Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不同区域的计算机之间通过RMI发送日期_Java_Rmi - Fatal编程技术网

Java 在不同区域的计算机之间通过RMI发送日期

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数据库的日期列中 解决这个日期不正确问题的最佳方法是什么?

我在通过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日!