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

garrick

Well-Known Member
Lotus team
26.10.2009
881
79
#1
Только у меня так или это фича такая? Если считать дату из документа Lotus Notes (в поле тип DATE, только дата без времени), то при преобразовании этой даты в java.util.Date к дате, считанной из поля документа Lotus Notes добавляет текущее время с компьютера, где производится данная операция.

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

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

garrick

Well-Known Member
Lotus team
26.10.2009
881
79
#2
<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">
Код:
	/**
* Возвращает значение даты из поля документа 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;
}
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#3
ф-ции нотуса в джава писаны соответ. людьми :), что еще можно от них ожидать...
я не помню, но вродить можно через бридж передавать дату, вот тока в чем она получается...
др. словами - из LS пихаем дату в java, там уже и сморим

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

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#5
Только у меня так или это фича такая? Если считать дату из документа Lotus Notes (в поле тип DATE, только дата без времени), то при преобразовании этой даты в java.util.Date к дате, считанной из поля документа Lotus Notes добавляет текущее время с компьютера, где производится данная операция.

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

Никто не сталкивался? Как лечить?
это нормальное явление, аналогично, только вместо 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);
}
 

garrick

Well-Known Member
Lotus team
26.10.2009
881
79
#6
Так проблема не в том, чтобы "отрезать" время, а в том, что в поле в Lotus Notes времени нет, а он подставляет текущее. Мой костыль не отрезает время, а добавляет 0 часов 0 минут, если в лотусовом поле времени нет.
 

garrick

Well-Known Member
Lotus team
26.10.2009
881
79
#7
Для различных манипуляций с датами и календарём есть JodaTime и DateUtils из Apache Commons-Lang. Там много всякого интересного.

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#8
Так проблема не в том, чтобы "отрезать" время, а в том, что в поле в Lotus Notes времени нет, а он подставляет текущее. Мой костыль не отрезает время, а добавляет 0 часов 0 минут, если в лотусовом поле времени нет.
говорим об одном и том же... суть 2-го предложения - не преобразовывать в строку и обратно
с первым все и так ясно - гнать дату из ЛС
 

garrick

Well-Known Member
Lotus team
26.10.2009
881
79
#9
говорим об одном и том же... суть 2-го предложения - не преобразовывать в строку и обратно
с первым все и так ясно - гнать дату из ЛС
Тогда поясни как этим пользоваться. Если я правильно понял твоя функция всегда однозначно отрезает время от лотусовой даты. А как быть есть надо оставить время, когда оно есть, и корректно отобразить дату (dd.MM.yyyy HH:mm:ss) без "левого" времени когда его в лотусовой дате нет? В качестве примера есть даты: "Дата рождения", "Дата выдачи паспорта" и пр. и даты: "Дата/время поступления заявки", "Дата/время окончания обработки заявки". В первом случае наличие времени будет выглядеть странным, во втором обязательно. Для каждого случая писать отдельную функцию считывания даты из Лотуса (со временем и без) и помнить для какого поля какую надо применять? Или я чего-то не понял? :)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#10
"не мой мопед" :) ты анализируешь дату из поля получаешь что там нет времени, вместо того чтобы проставить 0 - индусы вбивают текущее время
НО так ли это на самом деле - что времени нет в поле ли просто ф-ция работает коряво?
потому что я не знаю способа интеративно указать только дату, в поле, вот взять оттудова - да
скриптом вбить туда - да
может вопрос в некорректности поля, а уж дальше лагает индусский код?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#11
поигрался...
индусы....
короткий кастыль<!--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]
 

garrick

Well-Known Member
Lotus team
26.10.2009
881
79
#12
Здорово. Кратко и элегантно. Только у меня одно сомнение...
Уверен, что dt.setLocalTime("00:00:00") не затрёт дату, останется только время?
Может лучше dt.setLocalTime(dt.getDateOnly() + " 00:00:00")?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#13
да, КМК нерпав :)
мысль была задать только время, лучше тогда вынести это в java.date по томуже if
и хотелось избежать работы со строками