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灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP