3

我正在使用 GWT RPC 将包含日期的字符串从客户端发送到服务器(它必须是这种方式,因为它位于请求标头上)。

在服务器端,我使用 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 年 4 月 11 日星期三 17:29:49 NOVST
客户端:2012-04-11 17:29:49 +0700
来自客户端的服务器日期标头:2012-04-11 17:29:49 +0700
x = 4 月星期三2012 年 11 月 11 日 17:29:49


汤姆猫

  1. 使用PC:客户端和服务器有相同的时间。

(显然看不到客户端的打印)

来自客户端的服务器日期标头:2012-04-11 17:31:37 +0700
x = Wed Apr 11 17:31:37 NOVST NOVST 2012

  1. 手机客户端,有别于服务器。

来自客户端的服务器日期标头:2012-04-11 15:34:35 +0500
x = Wed Apr 11 17:34:35 NOVST 2012

结论: SimpleDateFormat 忽略字符串上的时区。我不想要那个!我希望它能够正常工作。我怎样才能使这项工作?提前谢谢你。

4

1 回答 1

1

SimpleDateFormat不会忽略时区,因为它已经调整了时间,将 15:34:35 +0500 解析17:34:35 NOVST(其中NOVST为 +0700,本地时区),只是那java.util.Date只是一个来自 Epoch 的时间戳并且没有时区的概念(参见javadoc:一切都与本地时区相关)。

如果您想在服务器端获取客户端的时区,则必须从序列化日期中解析时区字段(您可以拆分空格,保留最后一部分 - 时区部分 - 并将其传递给以 )java.util.TimeZone.getTimeZone()为前缀GMT
或者,您可以使用类型跟踪时区信息的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());
于 2012-04-11T13:06:13.920 回答