java - GWT 客户端 - 服务器 SimpleDateFormat 将时区更改为默认值

标签 java simpledateformat date-parsing

我正在使用 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

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

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

来自客户端的服务器日期 header :2012-04-11 17:31:37 +0700
x = 2012 年 11 月 11 日星期三 17:31:37

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

来自客户端的服务器日期 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:所有内容都与本地 时区相关)。

如果你想在服务器端获取客户端的时区,你必须从序列化日期中解析出时区字段(你可以按空格拆分,保留最后一部分 - 时区部分 - 和将其传递给前缀为 GMTjava.util.TimeZone.getTimeZone()
或者,您可以使用 JodaTimeDateTime 类型跟踪时区信息;就像是:

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/

相关文章:

java - 当我用Eclipse调试时,为什么arraylist的大小是1但elementData是10?

java - JXDatePicker 使用 SimpleDateFormat 将 dd.MM.yy 格式化为当前世纪的 dd.MM.yyyy

java - Java 有没有办法将字符串转换为 MMddyyyy 或 Mddyyyy 日期?

java - 如何在解析不正确的字符串时获得异常或任何类型的反馈

java - 无法使用 DateTimeFormatter 解析月+日

python - python 中 strftime 的基本日期解析用法

java - 将参数传递给打印方法(JAVA)

java - 如果我们可以使用访问器访问私有(private)数据成员,那么为什么我们不能访问私有(private)方法呢?

Java 反射 : How can I retrieve anonymous inner classes?

java - 启用 2 时间格式输入并计算时差的简单 java 程序