Java GWT客户端-服务器SimpleDataFormat将时区更改为默认时区

Java GWT客户端-服务器SimpleDataFormat将时区更改为默认时区,java,simpledateformat,date-parsing,Java,Simpledateformat,Date Parsing,我使用GWT RPC从客户端向服务器发送一个包含日期的字符串(必须这样,因为它位于请求头上) 在服务器端,我使用SimpleDataFormat解析该字符串,并生成所需的逻辑 我正在将手机和电脑设置为不同的时区,并将使用托管模式在tom cat上运行测试项目 代码如下: 客户: DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss Z"); Date date = new Date(); System.out.pr

我使用GWT RPC从客户端向服务器发送一个包含日期的字符串(必须这样,因为它位于请求头上)

在服务器端,我使用SimpleDataFormat解析该字符串,并生成所需的逻辑

我正在将手机和电脑设置为不同的时区,并将使用托管模式在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-1117:29:49+0700
来自客户端的服务器日期头:2012-04-11 17:29:49+0700
x=2012年11月11日星期三17:29:49


TomCat

  • 使用PC:客户端和服务器具有相同的时间 (显然看不到客户的打印)

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

  • 手机客户端,具有与服务器不同的功能
  • 来自客户端的服务器日期标头:2012-04-11 15:34:35+0500
    x=2012年11月11日星期三17:34:35

    结论:
    SimpleDataFormat忽略字符串上的时区。我不想那样!我想让它正常工作。我怎样才能做到这一点?感谢您的支持。

    SimpleDataFormat
    没有忽略时区,因为它调整了时间,将15:34:35+0500解析为17:34:35 NOVST(其中NOVST是+0700,本地时区),只是
    java.util.Date
    只是来自历元的时间戳,没有时区的概念(参见javadoc:一切都是相对于本地时区的)

    如果您想在服务器端获取客户端的时区,则必须解析序列化日期之外的时区字段(您可以在空格上拆分,保留最后一部分–时区部分–并将其传递给前缀为
    GMT
    )。
    或者,您可以使用其
    DateTime
    类型跟踪时区信息;类似于:


    谢谢你的评论。我正在考虑这两个选项,分离时区或使用JodaTime。我已经在尝试JodaTime,它在托管模式下运行良好,但我似乎无法使它在tomcat实例上运行。
    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());