java 板


LINE

有圖(?)有連結的網頁版: http://blog.dontcareabout.us/2012/02/gwtgae.html ======== 開發環境:GWT 2.4.0、GAE 1.6.1、GPE 2.5.1、Objectify 3.0 正在作一個預約系統,很自然會有「取出某天所有預約」之類的需求, 所以將 class 設計成這樣,期望能節省一些麻煩: class Booking{ Date date; int hour; //時間間隔以「小時」為單位 //skip other field } 由於 GAE 的 Datastore 理論上沒有提供在 query 時可以卡入日期函數, 所以如果不對日期作處理,下面這段「取得今天的預約」會完全取不到任何東西: Objectify ofy = ObjectifyService.begin(); ofy.query(Booking.class).filter("date", new Date()).list(); //empty list 原因應該是在於 Datastore 作比對時是直接使用 equal()(個人猜測,沒有實際證據), 而 java.util.Date 的 equal() 是判斷 getTime()...... 這取得到東西的或然率真的接近零了。 最直覺的反應是將日期中「小時」以下的單位全部歸零, 在 GWT 的 CalendarUtil 可以找到 resetTime() 的寫法: @SuppressWarnings("deprecation") // GWT requires Date private static void resetTime(Date date) { long msec = date.getTime(); msec = (msec / 1000) * 1000; date.setTime(msec); // Daylight savings time occurs at midnight in some time zones, so we reset // the time to noon instead. date.setHours(12); date.setMinutes(0); date.setSeconds(0); } 用這個方法,將 client 端傳上 server 的 date 都先「整理」過。 當然,媽媽說:「不要總是相信 client 端給的值」, 抱持著能省則省的白痴想法,所以忽略 deprecated 的訊息, 讓 server 也用同樣方法...... 神奇的事情發生了,有時候會正確、有時候會失敗...... 問題可以簡化成「client 端傳遞一個 reset 過的 date 給 server、 server 再 reset 一次回傳回來」, 把兩個 date 分別印出來,在 GPE 的 Development Mode 中, 有時候會得到這樣的結果: Sat Feb 11 12:00:00 CST 2012 Sat Feb 11 20:00:00 CST 2012 整整差了八小時...... 是的,是時區的問題。 如果 server 端在 reset 之前先把 date 印出來, 會得到「Sat Feb 11 04:00:00 UTC 2012」。 server 用 UTC 時區,這很合情合理, 實際 deploy 上 AppEngine 也是同樣的結果, 完全就是自己不應該硬要用 deprecated 的東西。 但那「有時候會正確、有時候會失敗」的靈異事件又是怎樣? 事實的真相是: 在一開始啟動 Development Mode 的 server 時, server 的時區是 UTC(所以會失敗); 但是在 reload web server 之後, server 的時區就會變成本地時區(所以會成功)。 這大概是最近發現第三個 GPE 的不思議之謎 (第一個是「更改 gwt.xml 需 refresh 兩次才見效」、 第二個是「build project 進度會卡住,關掉網路就沒事」) 好了,就讓系統一個日期各自表述, server 改用 Calendar 來設定日期,目前看起來運作正常...... [抖] Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+800")); c.setTime(new Date((date.getTime()/1000)*1000)); c.set(Calendar.HOUR_OF_DAY, 12); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTime(); 以下是延伸閱讀時間 XD: →在 objectify-appengine 的 Google Group,Jeff Schnitzer 提到 用 java.sql.Date。雖然說 Objectify 2.2.2 版就可以處理 java.sql.Date (GAE 只能儲存 java.util.Date)、GWT 也能使用 java.sql.Date, 不過不知道是我誤會意思還是? 實測的結果還是得先 reset 過才能符合需求—— 而且 java.sql.Date 基本上不能設定時間... →tkcn 提供的 reference(1、2)提到 可以用「Joda-Time」這個 library 來處理、以及一些其他資訊。 但是目前安逸於現在這個解法...... [毆飛] →原始 G+ 討論串 結語:這是一篇看起來好像很複雜,實際上根本就是技術太弱才會搞出來的飛機...... -- 錢鍾書: 說出來的話 http://www.psmonkey.org 比不上不說出來的話 Java 版 cookcomic 版 只影射著說不出來的話 and more...... --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.29.97







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP