【发布时间】:2012-01-24 20:21:24
【问题描述】:
我有一个定制的 GWT Date -Time 小部件,它是两个文本框的组合,一个用于保存日期,一个用于保存时间。当我输入日期 04/09/1956 12:00 AM(在 Date 小部件中)时,在我的小部件的 ValueChangeHandler 内部,我通过 GWT 的 DateTimeFormat 类的 format() 方法运行它,该方法接受日期和时区信息并给我一个格式化的日期字符串,它在显示时是用户友好的,然后根据该小部件中的日期,我在它的时间部分设置时间。
问题是当我输入不太旧的日期(我的观察是日期不早于 1981 年的日期)时,似乎根本没有问题。当我输入比 1956 年更早的日期时,有一些奇怪的夏令时逻辑通过将字符串的格式调整回 1 小时并给我 04/08/1956 11:00 PM 而不是 04 /09/1956 上午 12:00。尽管日期对象仍然代表我想要的日期,但格式化的字符串却被不同的日期表示弄乱了。
只有当我在生产模式下运行应用程序时,此问题才会重现。当我以托管模式在我的机器上本地运行它时,我根本看不到这个问题。这是最糟糕的部分。
我了解到,当我们在生产模式下运行时,GWT 从名为 noCache.js 的 javascript 文件中读取,而不是在托管模式下从 Web-INF/lib 文件夹中读取。
另外,我通过 GWT 的格式化程序在其他几个地方运行 java.util.Date 对象,在这些地方我手头有日期但从来没有遇到过这个问题.....当我在 ValueChangeHandler 中运行它时会出现。
以前有人遇到过这种奇怪的行为吗?
好的。下面是示例代码:
Date date = new Date();
date.setYear(1956 - 1900);
date.setMonth(3);
date.setDate(9);
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
// date here is 04/09/1956 12:00 AM
DateTimeFormat dateTimeFormat = new DateTimeFormat(somePattern); //pattern is a string //which represents which pattern you want to use
String formattedDateString = dateTimeFormat.format(date, timeZone); // timeZone is an //instance of com.google.gwt.i18n.client.TimeZone
// formattedDateString is 04/8/1956 11:00 PM. The time got pushed back by one hour.
【问题讨论】:
-
有趣。请发布相关代码和输出以寻求帮助。
-
我用一些示例代码更新了这个问题。感谢您考虑这个问题。
-
这可能是 microsoft windows 的问题。有些 PC 需要刷新其更新顺序或重新安装操作系统并重新完成更新。您是否在 XP 系统上以生产模式运行?您是否尝试过在各种其他操作系统上运行? Mac、Linux、Win 7?
-
在 HostedMode GWT 使用您的 java vm 中的时区,当您的应用程序强制使用不同的时区时,这可能会导致 Dates 的不同行为,例如格林威治标准时间。
-
根据使用的时区,您提到的结果可能是正确的,请提供准确的时区信息,您的代码示例中使用的时区以及您的系统或应用程序上使用的时区?
标签: java javascript gwt datetime production-environment