Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблмеи при работе с Date Object


Автор: zenit 21.4.2010, 20:07
Дорогие друзья, СОС!
Хоть и пытался вработаться в тематику работы с датами, не могу врубиться, как и куда сажать часовое смесщение летнего времени. Код заключается в том, чтобы считать с клиента отдельные фрагменты даты:
время, дата, временная зона(TimeZone). Из этих компонентов "леплю" обьект и помещаю его в базу данных.

Код

    private Date getPresentationStartDate(String date, String hours, String amOrPm, SimpleDateFormat formatter, TimeZone tz) {
        String dateStr = date + "-" + hours + " " + amOrPm;
        Date utcDate = new Date();
        try {
            formatter.setTimeZone(tz);
            utcDate = formatter.parse(dateStr);
        } catch (ParseException ex) {
            Logger.getLogger(RemotePresenterService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return utcDate;
    }

Из базы данных считывается объект след.образом:
Код

    public static Date getDateByTimestampAccordingToTimeZone(Timestamp timestamp, TimeZone targetTimeZone) {
        if (timestamp != null) {
            Calendar targetCal = new GregorianCalendar();
            targetCal.setTimeZone(targetTimeZone);
            targetCal.setTimeInMillis(timestamp.getTime());
            return targetCal.getTime();
        }
        return null;
    }


НО! У меня постоянно после того, как я считываю объект из базы данных смещение на 1 час! Дело, как мне кажется именно в getDSTSavings(). но вопрос, куда эго прибавлять/вычитать. Я всего лишь хочу записать и считать один и тот же обьект!  Дело в том, что в последствии данхые отправляются обратно на клиент и там они должны быть в соответствии с начальными параметрами(время, дата, зона) снова "расчленены"...Следовательно я передаю ещё и клиенту информацию через getOffset().

Плиииз, подскажите, куда мне девать этот одсет изначально!


Автор: dobrolub 22.4.2010, 05:55
А  почему ты не используешь GregorianCalendar (Коляды Дар smile) когда создаёшь Дату из елементов день, час, минута ? 

Тут нужно по крайней мере делать всё симметрично, и  Calendar самый лучший способ для этого.

И уж если у тебя date не всегда utcDate, то не надо её именовать utcDate.

Автор: zenit 22.4.2010, 10:12
что касается имени, здесь ДА - нужно исправить...но разве симметричность календаря мне поможет? тем более, что форматор возвратит мне Дату, а не календарь.

Автор: LSD 22.4.2010, 13:44
1. Внутри Date время всегда хранится в UTC. TimeZone появляется у Calendar, когда нам нужно получить компоненты даты. И изыски типа:
Код

Calendar targetCal = new GregorianCalendar();
targetCal.setTimeZone(targetTimeZone);
targetCal.setTimeInMillis(timestamp.getTime());
return targetCal.getTime();

смысла не имеют.

2. Из п. 1 следует, что надо сделать все, чтобы изначально правильно парсить время.

Раз уж временная зона у вас не фиксированна, то в СУБД дата должна хранится либо в UTC (тогда мы теряем изначальную временную зону), либо хранится в поле поддерживающем временную зону. Клиенту лучше всего передавать: время в Date/long и TimeZone.

Автор: zenit 29.4.2010, 16:38
Можно тогда Вас попросить предложить вариант ПРАВИЛьНОГО парзинга, чтобы быть уверенным, что в ДБ записана дата в UTC. Дело в том, что стринги от клиента я получаю отдельно: Дата, Время, AM/PM. И вот время, которое я получаю - это соотвественно время в одной из временных зон, которую выбрал для себя пользователь(18:00 Europe/Berlin, например...). От клиента я получаю легитимное ID для временной зоны, поэтому могу найти искомый объект: Timezone.getTimezone(ID). Вот только вопрос, как же мне сказать при использовании форматтера(ведъ именно с его помощью я превращу String в Date), чтобы он использовал правильный Offset для времени. Ведь если сказать formatter.setTimezone(UTC), то это будет неверно, ведь дата которую я получил, соответсвует времени не в UTC, а в указанной временной зоне. То есть нужен будет Цалендар, чтобы получать значиения отдельных временных параметров(год, месяц, час...)???

Автор: LSD 4.5.2010, 13:14
Код

  public static void main(String[] args) throws Exception
  {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    String estDateString = "1969-12-31 19:00:00.000";
    TimeZone est = TimeZone.getTimeZone("EST");

    String mskDateString = "1970-01-01 03:00:00.000";
    TimeZone msk = TimeZone.getTimeZone("Europe/Moscow");

    dateFormat.setTimeZone(est);
    Date estDate = dateFormat.parse(estDateString);
    System.out.println(estDate.getTime());

    dateFormat.setTimeZone(msk);
    Date mskDate = dateFormat.parse(mskDateString);
    System.out.println(mskDate.getTime());

    System.out.println("mskDate.equals(estDate) = " + mskDate.equals(estDate));
  }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)