2010-07-12 4 views
2

Lotus Java/CORBA 클래스를 사용하여 임의의 시간대로 Domino DateTime 오브젝트를 작성하려고합니다.Lotus Java/CORBA를 사용하는 TimeZone 문제점 session.createDateTime (Calendar)

나는 정수 시간 수의 기본 오프셋을 갖는 모든 시간대에서 성공한 것처럼 보입니다. 분수령 시간대, 특히 30 분의이란 시간대 인이란, 인도, 스리랑카 또는 네팔과 같이 흔치 않은 45 분의 오프셋이 적용됩니다. 나는 정수 시간대로 다시 계산되는 DateTime을 반환한다.이란 표준 시간대 (+03 : 30, 1 시간 DST)에서 18:45를 묻는 것은 나에게 18:45를 나타내는 DateTime을 제공한다. +03 : 00 오프셋.

이것은 실제로 표시된 순간을 변경 시키며,이 날짜를 약속에 기록 할 때 Notes 클라이언트가 날짜가 다른 시간대로 작성된 방법을 사용자에게 설명하는 결과를 초래합니다.

노트 자체는 제공된 시간대에 약속을 쓰는 데 아무런 문제가 없습니다. 물론 과정은 내가 사용하고있는 것보다 다른 연결을 통해 이루어 지지만.

자세한 내용은 현재 Domino 8.5.1 및 일치하는 클라이언트를 사용하고 있으며 여러 버전의 NCSO.jar 파일을 사용하여 문제를 확인했습니다.

Java/CORBA 클래스는 날짜를 만드는 세 가지 메소드 만 제공하며, 모두 세션 객체에 있습니다. 이러한 메소드의 1 개 (살) 만, 타임 존 대응 (java.util.Calendar 오브젝트의 수락)으로서 문서화되고 있습니다. 나는 domino Time/DateTime 필드를 업데이트하는 데 필요한 DateTime을 만드는 다른 방법을 알고 있습니다.

DIIOP 연결 로깅은 메서드 호출 패턴을 생성하며, 아래에서 다시 작성하여 DateTime 생성을 자세히 설명합니다.

전제 조건은 '세션'이라는 오픈 도미노 세션 객체입니다. 이 세션은 UTC + 08 : 00의 Perth에 위치한이 예제의 목적을 위해 세션을 비뚤어 진 시간 구성 요소의 소스로 제거합니다.

Domino와 함께 Java/CORBA 라이브러리를 사용하는 사람이 비슷한 문제를 겪었고이를 수정하기 위해 취해진 조치가 어떤 것인지 특히 관심이 있습니다. 또는 내가 알지 못하는 관련 방법에 관한 정보는 감사하겠습니다.

// first block creates a Calendar for 2010-07-21T10:15:00 in the Iran time zone. 
// so far, nothing domino specific. The resulting calendar is verified as correct. 

TimeZone tz = TimeZone.getTimeZone("Asia/Tehran"); 
Calendar calendar = Calendar.getInstance(tz); 
calendar.setTimeZone(tz); 
calendar.set(2010, 6, 21, 10, 15, 0); 

// first call 
DateTime result = session.createDateTime(calendar); 

// second call 
System.out.println(result.getTimeZone()); 

// third call 
System.out.println(result.getZoneTime()); 

위의 코드의 출력 및 추적 : (긍정적

first call to Domino produces the following DIIOP trace 
2010-07-12 23:22:28 DIIOP Session SN000472537: Executing createDateTimeObject 
2010-07-12 23:22:28 DIIOP Session SN000472537: Executing setZoneDateTimeFromJava 
2010-07-12 23:22:29 DIIOP Session SN000472537: Executing getDateTime 


second call to Domino, on the resulting DateTime object to retrieve the integer offset. We expect -3003, which is how Domino encodes 03:30 east of the prime meridian. Instead we recieve -3, which encodes 03:00 east of the prime meridian. 

second call to Domino produces the following trace 
2010-07-12 23:22:58 DIIOP Session SN000472537: Executing getDateTime 

second call produces the following stdout output 
-3 

third call to Domino to retrieve the printable time as Domino knows it. 

third call produces the following DIIOP trace. 
2010-07-12 23:23:14 DIIOP Session SN000472537: Executing getZoneTime 
2010-07-12 23:23:14 DIIOP Session SN000472537: Executing getDateTime 

third call results in the following stdout output 2010-07-21 10:15:00 ZE3 

는 "ZE3"시간대 도미노을 명확히하려면 일반 시간대에이 형식을 사용하며,이 지역 동쪽 "으로 읽을 수있다) offset 03:00 "입니다. A, B 또는 C는 15, 30 또는 45 분 오프셋의 접미어가 붙습니다. 따라서 예상 오프셋 +03 : 30은 "ZE3B"영역의 날짜가되어야하지만 불행히도 그렇지 않습니다.

+0

이전에는 알지 못했습니다. 꽤 큰 누락입니다. 스리랑카 나 네팔의 시간축 문제는 지구 적으로 얼마나 큰 영향을 줄지 모르겠지만 인도는 엄청난 시장이며 API에 큰 결함이 있음을 보여줍니다. 나는 주변에 일이 있는지보기 위해 보았지만, 나는 그 순간에 하나를 생각해 낼 수 없다. – Kerr

답변

2

나는이 문제를 해결하기 위해 session.createDateTime (Calendar) 메서드를 완전히 무시하려고 노력했다. timezone 동작이 명백하게 틀렸기 때문이다.

대신 session.createDateTime (Date)을 사용하여 세션 시간대에서 날짜를 만들고 dateTime.convertToZone (int, boolean) 메서드를 사용하여 필요한 영역을 할당합니다 (영역을 변경하지만 시간 필드는 변경하지 않음) . UTC + 01 : 00의 경우 1, UTC + 05 : 30의 경우 -3005, X는 오프셋의 전체 시간을 지난 분을 나타내는 XXYY와 같이 수동으로 도미노 영역을 계산해야합니다. YY는 오프셋의 정수 시간이고, 전체 구역은 자오선의 동쪽이면 부정됩니다. 또한 주어진 날짜가 DST인지 아닌지를 나타내는 부울을 제공해야합니다. 이 정보는 고맙게도 java.util.TimeZone을 통해 액세스 할 수 있습니다.

약간 번거롭지만 지금은 누구나 자신의 현지 시간을 사용할 수 있습니다.

+0

아, 저는 인수가 정수인 경우 어떻게 할 수 있을지 궁금합니다. 그래도 꽤 지저분 해. 형식을 어떻게 찾았습니까? 나는 문서에서 그것을 찾을 수 없었다. 아마 나는 단지 충분히 열심히 보지 않았다. – Kerr

+0

형식은 디버거에서 DateTime 프록시 개체의 내부 상태를 볼 때 명백하게 나타납니다. 초기 API 디자인 이후 소수 시간대 시간대에 대한 지원이 시작되었다고 생각됩니다.) UTC 오프셋과 비교할 때 부정적인 값은 미국 외부의 시간대를 고려하지 않은 사람이 설계하는 방식으로 나를 공격합니다. Domino와 함께 작업 할 때 염두에 두어야 할 또 하나의 유산. –

0

API를 보면 나는 이것을 직접 할 수 없을 것이라고 생각합니다. 왜 Domino DateTime 오브젝트가 필요한지 잘 모르겠지만, 문서의 값을 저장해야한다면 @formula를 사용하여이 문제를 해결할 수 있습니다.

Session.evaluate(String formula, Document doc)을 사용하여 주어진 문서의 맥락에서 공식을 평가하십시오. 이것은 날짜 시간을 저장하려는 문서입니다. 수식을 문자열로 구성한 다음 전달해야합니다.

다음과 같은 식은 FIELD foo:[email protected]("14/07/2010 15:30:00 ZE5C")과 같을 것입니다. 그러면 foo이라는 필드가 지정된 DateTime 값으로 설정됩니다.

String dateString="14/07/2010 15:30:00 ZE5C"; 
session.evaluate("@SetField(\"foo\";@ToTime(\""+dateString+"\"))", doc); 
doc.save(); 

당신은 문서에 저장된 값을 일단 당신이 돌아 오기 값을 확인하려면 실험을해야하지만 최악의 시나리오는 점이다

그래서 당신의 자바 호출은 다음과 같이 보일 것입니다 @formula를 평가하여 값을 읽어야합니다.

+0

당신이 제안한 해결책을 시도해 보았고, 불행히도 @ToTime이 명시 적으로 명명 된 영역 (CET, EST, MST 등)을 제외하고 날짜/시간 문자열에서 영역 정보를 제대로 처리하지 못하는 것 같습니다. 모든 ZWx, ZWxy, ZEx 및 ZExy 영역에서는 기본적으로 영역 정보가 세션 영역 (도미노 서버 자체의 영역)에 저장됩니다. 또 다른 결함은 FIELD 공식이 전혀 평가를 거부하는 것처럼 보이지만 @SetField로 대체하면이를 해결한다는 것입니다. –

+0

죄송합니다. 디자이너가 손으로 제대로 확인하지 못했기 때문에 나는 그 해답을 조금 띄우고있었습니다. @SetField를 잘 잡습니다. 이상한 @ToTime 작동하지 않았다, 그것은 작업 단추에서 작동합니다. 평가를 통해 왜 작동하지 않는지 나는 생각할 수 없다. – Kerr