2010-07-12 58 views
2

我正在嘗試使用Lotus Java/CORBA類在任意時區創建Domino DateTime對象。使用Lotus Java/CORBA的TimeZone問題session.createDateTime(日曆)

我看起來對於所有具有小時整數倍的基準偏移的時區都是成功的。對於部分時區,特別是像伊朗,印度和斯里蘭卡這樣的半小時區域,或者像尼泊爾那樣不太常見的區域,其時間偏差爲45分鐘。我最終返回一個重新計算爲整數時區的日期時間,例如試圖在伊朗時區(+03:30和1小時DST)中請求18:45,這會給我一個DateTime,代表18:45, +03:00偏移。

這給我帶來了很大的麻煩,因爲它實際上會改變所代表的瞬間,並且導致在將此日期寫入Appointment時,Notes客戶機向用戶解釋日期如何寫入不同的時區。

筆記本身在提供的時區中寫約會沒有問題,雖然它當然是通過不同的連接方式而不是我使用的。

至於細節,我目前使用的是Domino 8.5.1和一個匹配的客戶端,並且已經使用幾個不同版本的NCSO.jar文件來驗證問題。

Java/CORBA類只提供三種創建日期的方法,所有這些方法都在會話對象上。只有其中一種方法被記錄爲時區感知(接受java.util.Calendar對象)。我知道沒有其他方法來創建更新多米諾骨牌時間/日期時間字段所需的日期時間。

記錄DIIOP連接只會產生方法調用模式,下面摘錄的摘錄中詳細介紹了創建DateTime的過程。

先決條件是一個名爲'session'的開放式多米諾會話對象。本次會議的目的是在位於珀斯的UTC + 08:00舉行,以消除它作爲偏斜時間分量的來源。

如果有人在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」時區Domino使用這種格式用於一般時區,它是將被讀取爲「區東(正)偏移03:00「。 A,B或C可以加後綴15,30或45分鐘。因此預期的偏移+03:30應該在區域「ZE3B」中產生一個日期,但不幸的是沒有。

+0

以前從未注意到這一點。相當大的遺漏。我不確定全球對伊朗,斯里蘭卡或尼泊爾的時區有什麼影響,但印度是一個巨大的市場,並且在API中有很大的缺陷。我看了一下,看看是否有工作,但目前我無法提出。 – Kerr 2010-07-13 15:29:12

回答

2

我已經通過選擇完全忽略session.createDateTime(Calendar)方法來解決此問題,因爲它的timeZone行爲顯然不正確。

相反,我使用session.createDateTime(Date)在會話時區中創建日期,並明確使用dateTime.convertToZone(int,boolean)方法來分配所需區域(改變區域,但不改變時間字段) 。這需要手動計算多米諾骨牌區域(UTC-01:00爲1,UTC + 01:00爲-1,UTC + 05:30爲-3005,即XXYY,其中X爲偏移量整個小時的分鐘數, YY是偏移量中的整數小時數,如果整個區域位於素數子午線以東,則整個區域將被否定)。您還需要提供一個布爾值,指示給定日期是否在DST中。這些信息非常容易通過java.util.TimeZone訪問。

有點麻煩,但至少現在每個人都可以使用他們自己的本地時間。

+0

啊,我想知道如果參數是一個整數,他們怎麼可能做到這一點。雖然這很麻煩。你是如何找出格式的?我無法在文檔中找到它。也許我只是不夠努力。 – Kerr 2010-07-15 11:24:12

+0

在調試器中查看DateTime代理對象的內部狀態時,格式變得很明顯。我懷疑在最初的API設計之後,對小數小時時區的支持就被鎖定了;)與UTC時差相比,否定的價值讓我覺得有些人不認爲美國以外的時區可能會設計一些東西。在使用Domino時還需要記住另一點遺留問題。 – 2010-07-15 13:41:25

0

看着API我不認爲你會直接做到這一點。我不確定爲什麼需要使用Domino DateTime對象,但是如果您需要做的是將值保存在文檔中,則可以使用@formula解決此問題。

使用Session.evaluate(String formula, Document doc)來評估在給定文檔的上下文中的公式。這將是您想要保存日期時間的文檔。您需要將公式構建爲字符串,然後將其傳入。

您需要的公式類似FIELD foo:[email protected]("14/07/2010 15:30:00 ZE5C")這會將名爲foo的字段設置爲指定的DateTime值。

所以,你的java調用會是這個樣子:

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替換它解決了這個問題。 – 2010-07-15 07:44:03

+0

糟糕。我一直在回答這個問題,因爲我沒有設計師手來檢查它是否正確。很好的@SetField。奇怪的是,@ToTime不起作用,它在一個動作按鈕中起作用。我想不出爲什麼它不會通過評估工作。 – Kerr 2010-07-15 11:26:30