你只需要记住,一个 Date 对象 (永远) 以自 UTC/GMT 时区的纪元毫秒数存储日期/时间。导致人们困惑的是,Date.toString() 方法以 JVM 的默认时区 (通过内部 Calendar 对象) 返回文本表示。请查看 JDK 源代码。
因此,例如在我的计算机上,
Date now = new Date();
System.out.println(now.toString());
System.out.println(now.getTime())
将会给予
Fri Oct 02 06:56:24 EST 2009
1254430584531
毫秒数是从GMT/UTC时区的时间纪元开始计算的实际毫秒数。
在操作或使用日期对象时,应始终使用日期格式化程序或日历实例。例如:
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:MM:ss zzz yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(now.toString());
System.out.println(sdf.format(now));
提供
Fri Oct 02 06:56:24 EST 2009
Thu Oct 01 20:56:24 UTC 2009
总之:始终将日期对象视为数据,即自纪元以来的毫秒数。 (不要使用任何已弃用的方法,也不要使用toString(),除非您了解它显示的内容。)要显示、格式化、转换(添加减去时间等)日期/时间,请始终使用Calendar实例或DateFormat实现,很难出错。
正如Date的Javadoc所述:
“在JDK 1.1之前,Date类具有两个额外的功能。它允许将日期解释为年、月、日、小时、分钟和秒值。它还允许格式化和解析日期字符串。不幸的是,这些功能的API不适合国际化。从JDK 1.1开始,应该使用Calendar类在日期和时间字段之间进行转换,应该使用DateFormat类格式化和解析日期字符串。日期中的相应方法已被弃用。”
尝试使用Date、Calendar和Formatter进行实验,阅读Javadoc,它会变得更加清晰。
对于你问题的第一部分,你不需要设置Glassfish服务器的时区来适应你的数据。如果您想将时区数据与您的数据/时间值一起存储,则在对象中使用Calendar而不是Date。或者像我通常做的那样,一切都以UTC时间(在数据库和Date实例中)存储,并且仅在数据显示/输出或解析时使用时区。因此,当接收到数据时,请使用设置为+01:00的DateFormat或类似格式解析它(如果时间字符串附有时区,则它可能会自动获取该值,就像您的示例一样)。
我不知道你问题的第二部分,但是如果你的Web服务端正确处理日期并正确解析它们,则无需您的干预即可处理此问题。