2012-08-16 62 views
6

好的人,我一直在解決這個問題大約2周,現在嘗試我能想到的所有事情,並在這裏看到噸的答案,覺得他們將要回答它,但我只是無法解決我如何去做我想做的事情,而且它絕對讓我堅強起來!似乎沒有人能夠在任何地方得到答案,全球各地都有一半的答案,但似乎沒有人真正做到我需要做的事情,肯定有人會解決這個問題!請原諒真正長期的問題,但重要的是要問這個問題是正確的,以便答案能夠真正回答這個問題! :d從GAE服務器發送日期和時區到GWT客戶端

也請不要打擾閱讀任何進一步的,如果你很可能會提供不考慮任何答案,我的數據存儲/服務器是谷歌的App Engine(GAE),和我的客戶是使用Google Web Toolkit(GWT)編寫,一切都用Java編寫,我不知道任何關於Python或MySQL或PHP或任何類似的東西

最後,如果有人知道一個更好的地方來找出這樣的東西,請做讓我知道,因爲我一直在想這樣的問題,並不知道如何找到一個解決方案,而不是在這裏,或花幾個小時搜索谷歌的其他人已經設法弄清楚。我也不知道如何從JavaDocs中找出任何東西 - 對不起,但直到有人向我解釋它,我只是不會得到它

我有一個日期時間存儲在服務器上(顯然在UTC)我也有存儲在服務器上爲每個企業主存儲一個TimeZone作爲字符串(例如"America/New_York")。該字符串通過在服務器上使用java.util.TimeZone.getAvailableIDs()獲得,並讓業務所有者爲其業務選擇相關時區(如果他們不選擇任何內容(默認值爲"Europe/London"),則無需掛斷)我需要通過日期時間在未來某個時間點回到客戶端PC,因爲日期時間需要根據企業主的時區顯示,因此在他們的PC上忽略本地時區。

作爲一個例子,企業主是倫敦的理髮師,他們有一個在線預約時間表,可供任何他們的潛在客戶查看。其中一位客戶(也是在倫敦)想要預約,9月3日星期一在BST上午9點看到一個位置並預訂。

然後將它作爲UTC時間(實際上是0800,因爲BST是UTC + 1)存儲在數據存儲區中,當然企業所有者已選擇"Europe/London"作爲其時區。一切都很好。

現在,在未來的某個時間點,客戶正在紐約的一次商務會議上,並意識到他們在下週有一個預約在倫敦理髮,他們希望將它移動一週,所以他們然後嘗試查看預約(在理髮師任用書中),但他們不希望將其視爲紐約時間凌晨4點,他們希望將其視爲英國時間上午9點。

所以我的問題是,當客戶點擊查看關於9月3日的約會,服務器可以發回的0800一個UTC日期時間和"Europe/London"

一個java.util.TimeZone ID字符串,但由於在客戶端上我只能用

com.google.gwt.i18n.client.TimeZone 

它不允許我使用的功能

TimeZone bizTimeZone=TimeZone.getTimeZone("Europe/London") 
(which works for `java.util.TimeZone`) 

,因爲它會導致錯誤

"The method getTimeZone(String) is undefined for the type TimeZone" 

它表明,它改變到

com.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London") 

但這個版本中,期待一個GWT com.google.gwt.i18n.client.TimeZoneConstants「對象」(在該消息的末尾示出的例子),而不是簡單的字符串,所述java.util.TimeZone.createTimeZone()將接受。

我可以通過創建此:

final TimeZoneConstants constTz = GWT.create(TimeZoneConstants.class); 
final TimeZone timeZoneCali = TimeZone.createTimeZone(constTz.europeLondon()); 

但我不知道如何做到這一點時,即時通訊開始"Europe/London"和/或我不知道如何對這個對象存儲到App Engine的數據庫,然後檢索它後來。

順便之間的註釋文字我已經使用以下行也嘗試:

//Calendar tmad = new GregorianCalendar(TimeZone.getTimeZone("Europe/London")); 
//Calendar cal = Calendar.getInstance(someTimeZone); 
//DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
//df1.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
//final TimeZone timeZoneClient = TimeZone.createTimeZone("Europe/London"); 
//dtf.format(date,timeZoneClient) 

必須有一定這樣做的標準方式,我真的不能是第一人,曾經有解決這個問題!

constTz。europeLondon()= {「transitions」:[19394,60,24770,0,2830, ,60,33506,0,36866,60,42242,0,45602,60,50978,0,54506,60, 59714, 0,63242,60,68450,0,71978,60,77354,0,80714,60,86090, 0,89450,60,94826,0,9851,60,103561,0,107257,60,112297,0, , 115993,60,121033,0,124729,60,129937,0,133633,60,138673,0,142369,60,147409,0,151105,60,156145,0159841,60,184881,0 , 168577,60,173785,0177313,60,182521,0,186217,60,191257,0, 194953,60,199993,0,03689,60,208729,0,224425,60,217465,0212465,0217437,01204701, , 221161,60,26201,0,230065,60,235105,0,238801,60,243841,0, 247537,60,252577,0,26273,60,261481,0,265009,60,270217,0 , 273745,60,278953,0,282649,60,287689,0,291385,60,296425,0, 300121,60,305329,0,308857,60,314065,0,317593,60,322801,0, 326329,60,331537,0,335233,60,340273,0,343969,60,349009,0,352705,60,357913,0361441,60,366649,0,370177,60,375385,0, 379081,60,384121,0,387817,60,492857,0,396553,60,401593,0, 405289,60,410497,0,414025,60,419233,0422761,60,427969,0 431665,60,436705,0,440401,60,445441,0449137,60,4454345,0, 457873,60,463081,0,466609,60,471817,0,475513,60,480553,0, 484249,60,489,249,0492985,60,498025,0,501721,60,506929,0, 510457,60,515665,0,519193,60,524401,0,528097,60,533137,0, 536833,60,541873,0,555569,60,550777,0,554305,60,559513,0, 563041,60,568249,0,571777,60,576985,0,580681,60,585721,0, 589417,60,594457,0],「names」:[「GMT」,「Greenwich Mean Time」,「BST」, 「British Summer Time」],「id」:「Europe/London」,「std_offset」 :0}

+0

有可能是我丟失的東西,但不能只是在服務器端使用java.util.TimeZone轉換日期,並將轉換後的日期發送到客戶端? – jrochette 2012-08-16 14:40:16

+0

我不認爲你可以這樣做嗎?當然,時區只是一個格式化的東西適用於日期本身,除非你建議我應用時區,格式化爲一個字符串,然後解析它並作爲字符串數組發回? EG'string [] = {「2012」,「09」,「03」,「09」,「00」,「00」};' – johnvdenley 2012-08-16 14:59:22

+0

是的,這就是我的意思(對不起更清楚) – jrochette 2012-08-16 15:10:17

回答

0

您是否嘗試過,例如,TimeZone.createTimeZone("Europe/London");?至少在較新版本的GWT中,這種方法接受了一大堆名字,顯然是從「CLDR和Olson時區數據庫[原文]」編寫的。該文檔特別引用您的用例:通過json傳輸時區。

請參閱the properties file - 它似乎具有時區的所有標準名稱。

如果這不適合你,你可以在幾分鐘內發送時區的偏移量,然後用TimeZone.createTimeZone(offsetInMinutes)創建你的時區。

+0

我試過TimeZone.createTimeZone(「歐洲/倫敦」)的問題的答案;它不適用於我當前版本的GWT 2.2,但我注意到v2.4可以升級到,所以我可以嘗試... – johnvdenley 2012-08-16 23:29:24

+0

是的,我不知道它變成可用的版本。可能值得一試〜 – 2012-08-17 15:02:25

+0

我現在已經升級到GWT 2.4(最新版本),而com.google.gwt.i18n.client.TimeZone.createTimeZone(「Europe/London」)這行'仍然會崩潰我的GWT客戶端,文檔狀態: 'com.google.gwt.i18n.client.TimeZone.createTimeZone(String tzJSON)' 和 '此工廠方法從包含所需時區的時區信息的JSON字符串創建時區實例。應用程序可以從TimeZoneConstants類中獲取這樣一個字符串' – johnvdenley 2012-08-18 00:41:56

2

我有一個與v2.4類似的問題。

我認爲萊利百靈是對的。

TimeZone.createTimeZone( 「亞洲/東京」)沒有在GWT工作2.4

然而,我發現我可以通過使用瀏覽器的默認設置讓東京區:

Date d = new Date(); 
TimeZone timezone = TimeZone.createTimeZone(d.getTimezoneOffset()); 

那真的是什麼萊利雲雀是因爲europeLondon爲您推薦了 「std_offset」:0 ...

時區時區= TimeZone.createTimeZone(0);

+0

根據日期進行偏移更改。作爲結果,您可能會得到錯誤的時區。 – 2014-05-17 19:44:49

相關問題