Datetime.tojavadate() Добавляет Текущее Время

Тема в разделе "Lotus + Java + LS2J", создана пользователем garrick, 24 сен 2013.

  1. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Только у меня так или это фича такая? Если считать дату из документа Lotus Notes (в поле тип DATE, только дата без времени), то при преобразовании этой даты в java.util.Date к дате, считанной из поля документа Lotus Notes добавляет текущее время с компьютера, где производится данная операция.

    Для получения DateTime использовалось Document.getItemValueDateTimeArray() и Item.getDateTimeValue() - результат одинаков.
    На клиенте, на сервере - разные версии Lotus 8.5.2, 8.5.3, 9.0 - везде одно и тоже.

    Никто не сталкивался? Как лечить?
     
  2. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Костыль</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
        /**
    * Возвращает значение даты из поля документа Lotus Notes.
    *
    * @param item поле документа Lotus Notes.
    * @return значение даты из поля документа Lotus Notes.
    * @see lotus.domino.Item
    */
    public static java.util.Date getItemValueDate(Item item) {
    java.util.Date date = null;
    if (item != null) {
    try {
    if (item.getType() == Item.DATETIMES) {
    // если поле формата "дата" считываем его значение
    DateTime datetime = item.getDateTimeValue();
    if (datetime != null) {
    String ds = datetime.toString();
    if (ds.length() <= 10) {
    ds = ds.concat(" 00:00:00");
    datetime.setLocalTime(ds);
    }
    date = datetime.toJavaDate();
    datetime.recycle();
    }
    }
    } catch (NotesException ne) {
    ne.printStackTrace();
    }
    }
    return date;
    }
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    ф-ции нотуса в джава писаны соответ. людьми :), что еще можно от них ожидать...
    я не помню, но вродить можно через бридж передавать дату, вот тока в чем она получается...
    др. словами - из LS пихаем дату в java, там уже и сморим

    Добавлено: вспомнил - передаем в соответ. с классами (т.е. с полным указанием имени)
    хотя тоже кастыль, ибо писать на LS
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
  5. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    это нормальное явление, аналогично, только вместо Date использовал Calendar
    Код (C++):
    public static Calendar getCalendarDateOnly(Item item) {
    try {
    if (item != null && item.getType() == ITEM_TYPE_DATETIME) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(getAsLotusDateOnly(item).toJavaDate());
    return getDateOnly(calendar);
    }
    } catch (NotesException e) {
    LOG.error("{}", e);
    }
    return null;
    }

    public static Calendar getDateOnly(Calendar calendar) {
    if (calendar == null) {
    return null;
    }
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    return getDateOnly(year, month, day);
    }

    public static Calendar getDateOnly(int year, int month, int day) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month - 1);
    calendar.set(Calendar.DAY_OF_MONTH, day);
    setEmptyTime(calendar);
    return calendar;
    }

    public static void setEmptyTime(Calendar calendar) {
    setTime(calendar, 0, 0, 0, 0);
    }

    public static void setTime(Calendar calendar, int hour, int min, int sec, int millisec) {
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, min);
    calendar.set(Calendar.SECOND, sec);
    calendar.set(Calendar.MILLISECOND, millisec);
    }
     
  6. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Так проблема не в том, чтобы "отрезать" время, а в том, что в поле в Lotus Notes времени нет, а он подставляет текущее. Мой костыль не отрезает время, а добавляет 0 часов 0 минут, если в лотусовом поле времени нет.
     
  7. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Для различных манипуляций с датами и календарём есть JodaTime и DateUtils из Apache Commons-Lang. Там много всякого интересного.

    А Apache Commons-Lang я вообще в jvm/lib/ext сразу кладу, т.к. постоянно оттуда что-нибудь использую.
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    говорим об одном и том же... суть 2-го предложения - не преобразовывать в строку и обратно
    с первым все и так ясно - гнать дату из ЛС
     
  9. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Тогда поясни как этим пользоваться. Если я правильно понял твоя функция всегда однозначно отрезает время от лотусовой даты. А как быть есть надо оставить время, когда оно есть, и корректно отобразить дату (dd.MM.yyyy HH:mm:ss) без "левого" времени когда его в лотусовой дате нет? В качестве примера есть даты: "Дата рождения", "Дата выдачи паспорта" и пр. и даты: "Дата/время поступления заявки", "Дата/время окончания обработки заявки". В первом случае наличие времени будет выглядеть странным, во втором обязательно. Для каждого случая писать отдельную функцию считывания даты из Лотуса (со временем и без) и помнить для какого поля какую надо применять? Или я чего-то не понял? :)
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    "не мой мопед" :) ты анализируешь дату из поля получаешь что там нет времени, вместо того чтобы проставить 0 - индусы вбивают текущее время
    НО так ли это на самом деле - что времени нет в поле ли просто ф-ция работает коряво?
    потому что я не знаю способа интеративно указать только дату, в поле, вот взять оттудова - да
    скриптом вбить туда - да
    может вопрос в некорректности поля, а уж дальше лагает индусский код?
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    поигрался...
    индусы....
    короткий кастыль<!--shcode--><pre><code class='java'>Item item=doc.getFirstItem("dtField");
    if (item.getType()== Item.DATETIMES){
    DateTime dt=item.getDateTimeValue();
    if (dt.getTimeOnly().length()<1) {dt.setLocalTime("00:00:00");}
    Date jd=dt.toJavaDate();
    System.out.println(jd.toLocaleString());
    }[/CODE]
     
  12. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Здорово. Кратко и элегантно. Только у меня одно сомнение...
    Уверен, что dt.setLocalTime("00:00:00") не затрёт дату, останется только время?
    Может лучше dt.setLocalTime(dt.getDateOnly() + " 00:00:00")?
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    да, КМК нерпав :)
    мысль была задать только время, лучше тогда вынести это в java.date по томуже if
    и хотелось избежать работы со строками
     
Загрузка...
Похожие Темы - Datetime tojavadate() Добавляет
  1. Kozolick
    Ответов:
    0
    Просмотров:
    144
  2. EugenOS
    Ответов:
    2
    Просмотров:
    694
  3. vvlad
    Ответов:
    9
    Просмотров:
    2.278
  4. dimat
    Ответов:
    12
    Просмотров:
    4.136
  5. wowa
    Ответов:
    11
    Просмотров:
    4.358

Поделиться этой страницей