我正在使用 GWT RPC 将包含日期的字符串从客户端发送到服务器(它必须是这种方式,因为它在请求 header 上)。
在服务器端,我使用 SimpleDateFormat 解析该字符串并制作我想要的逻辑。
我将我的手机和电脑设置为不同的时区,并将使用托管模式并在 tom cat 上运行测试项目。
代码如下:
客户:
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss Z");
Date date = new Date();
System.out.println("client: " + date.toString());
System.out.println("client: " + dtf.format(date));
builder.setHeader("Date1", dtf.format(date));
服务器:
String dateHeader = request.getHeader("Date1");
System.out.println("Server date header from client: " + dateHeader);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
System.out.println("x = " + sdf.parse(dateHeader));
System.out.println("Timezone = " + df.getTimeZone().getDisplayName());
结果:
托管模式
客户:2012 年 11 月 11 日星期三 17:29:49
客户:2012-04-11 17:29:49 +0700
来自客户端的服务器日期 header :2012-04-11 17:29:49 +0700
x = 2012 年 11 月 11 日星期三 17:29:49
TomCat
- 使用 PC:客户端和服务器具有相同的时间。
(显然看不到客户端的打印)
来自客户端的服务器日期 header :2012-04-11 17:31:37 +0700
x = 2012 年 11 月 11 日星期三 17:31:37
- 手机客户端,有别于服务端。
来自客户端的服务器日期 header :2012-04-11 15:34:35 +0500
x = 2012 年 11 月 11 日星期三 17:34:35
结论: SimpleDateFormat 忽略字符串中出现的时区。我不想要那个!我希望它能正常工作。我怎样才能使这项工作?先谢谢你。
最佳答案
SimpleDateFormat
不会忽略时区,因为它调整了时间,将 15:34:35 +0500 解析为 17:34:35 NOVST (NOVST 是 +0700,本地时区),只是 java.util.Date
只是 Epoch 的时间戳,没有时间戳的概念时区(请参阅 javadoc:所有内容都与本地 时区相关)。
如果你想在服务器端获取客户端的时区,你必须从序列化日期中解析出时区字段(你可以按空格拆分,保留最后一部分 - 时区部分 - 和将其传递给前缀为 GMT
的 java.util.TimeZone.getTimeZone()
。
或者,您可以使用 JodaTime其 DateTime
类型跟踪时区信息;就像是:
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z");
DateTime dt = fmt.parseDateTime(dateHeader);
System.out.println("x = " + fmt.print(dt));
System.out.println("Timezone = " + dt.getZone().toTimeZone().getDisplayName());
关于java - GWT 客户端 - 服务器 SimpleDateFormat 将时区更改为默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10104607/