【发布时间】:2012-05-30 16:16:17
【问题描述】:
我在调试的应用程序中遇到了一个令人沮丧的静态变量问题(我自己没有编写代码)。
我有一个名为 Transits 的 mysql 数据库表。 Transits 有一个字符串列 (varchar),其中包含格式为“yyyy/MM/dd HH:mm:ss”的日期 (eventdt)。
在我相应的休眠类中,我有一个日期变量,它将存储 eventdt 的值。因此,当读取 eventdt 时,代码会将其从字符串转换为日期。
代码使用 SimpleDateFormat 来进行转换。程序员使用了一个静态变量来保存格式,不幸的是出现了格式错误:
private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
保持原样,在中午时间存储在 eventdt 列中的每个日期都将作为午夜存储在相应的 Date 变量中。显然这是不可取的,所以我试图修复它:
private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
但是,代码继续保留之前的格式“yyyy/MM/dd hh:mm:ss”。
我已经阅读了一些静态变量,并尽我所能清除它。我重新编译了代码,然后重新部署(在 Glassfish 3.1.1 上)。我重新启动了 Netbeans (7.1.1),然后再次重建/重新部署。我清除了 Netbeans 缓存并重复了相同的过程。然后我删除了整个 Glassfish 安装,重新启动,重新创建域,再次清除缓存,并进行了相同的重建/重新部署。
我也尝试更改代码本身。我想也许这可能是一个线程问题,所以我将变量更改为静态最终:
private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
然后我将其更改为静态最终变量是格式字符串,并在需要它的每个方法中实例化 DateFormat 对象:
// In class variable block
private static final String DATETIME_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss";
// In class methods
DateFormat df = new SimpleDateFormat(DATETIME_FORMAT_PATTERN);
无论我做了什么,同样的错误格式“yyyy/MM/dd hh:mm:ss”被保留。
我能想到的唯一一件我还没有做的事情就是删除并重新安装 Netbeans。我在某处读过更新它也有帮助。我需要走那么远才能清除旧的静态变量吗?
我也没有尝试将代码放在同步块中或将其初始化为 ThreadSafe(尽管我什至不确定线程是这里的问题......)
我将不胜感激任何正确方向的指导,因为我的想法已经不多了。谢谢!
编辑:这里要求的是使用 DateFormat 的代码。 lpr 是另一个 Hibernate 对象,它整合了 Transits 表和一些其他需要的表。
Date activityDate = null;
try {
activityDate = df.parse(getEventdt());
lpr.setActivityDateTime(activityDate);
} catch (Exception e) {
logger.warn("Unable to parse " + getEventdt() + " as a date.");
}
【问题讨论】:
-
我还应该补充一点,我尝试在整个源代码中搜索可能已设置 DateFormat 的另一个位置,但没有发现任何其他出现错误格式的地方。非常感谢您的帮助!
-
您如何检查“代码继续保留以前的格式“yyyy/MM/dd hh:mm:ss””? SimpleDateFormat 不是线程安全的see this post for example.
-
NetBeans 是问题本质上是不可能的,这甚至没有意义。另请注意,
SDFs 不是线程安全的,尽管这取决于应用程序是否重要——它与您看到的问题无关。 -
@assylias 我通过调试器运行代码、使用格式化程序在代码处设置断点并检查 df 的值来检查。
-
@Caliris 正如我所说,
SDF的非线程安全性与您看到的问题无关。它是静态的几乎可以肯定是无关的。你要么没有部署你认为的代码,要么没有运行你认为的代码。