Отправка даты через RMI между машинами в разных регионах - PullRequest
0 голосов
/ 23 февраля 2009

У меня проблема с отправкой объектов java.util.Date через RMI, с машин на разные часовые пояса.

Например, клиент в Германии отправит объект даты на сервер в Великобритании.

  1. Пользователь вводит строку даты, например, 20090220.
  2. Клиентское приложение в Германии преобразует его в дату с помощью SimpleDateFormat ("yyyyMMdd"), что дает: пт 20 февраля 00:00:00 CET 2009
  3. Сервер в Великобритании получает дату через RMI как: четверг 19 февраля 23:00:00 по Гринвичу 2009
  4. Сервер сохраняет дату в столбце ДАТА базы данных 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);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 23 февраля 2009

Я не вижу, в чем ваша проблема, эти даты выглядят правильно для меня - они просто форматируются в соответствии с используемой локалью. Если вы хотите, чтобы введенная пользователем дата была в GMT, укажите локаль в конструкторе SimpleDateFormat

0 голосов
/ 23 февраля 2009

Взгляните на java.util.Calendar, в частности, на метод getTime ().

Таким образом, вы будете отправлять время в миллисекундах, а не в строке. Интерпретируемый по-разному.

0 голосов
/ 23 февраля 2009

Посмотрите на getTime () и setTime (). Они должны делать то, что вы ищете. Вместо того, чтобы отправлять его по проводам в виде строки, зависящей от местоположения, отправьте ее как количество миллисекунд с начала эпохи, используя getTime () на клиенте, затем создайте новую дату на клиенте и используйте setTime () с длинным значением на сервер.

...