我在调试的应用程序中遇到了一个令人沮丧的静态变量问题(我自己没有编写代码)。
我有一个名为 Transits 的 mysql 数据库表。Transits 有一个字符串列 (varchar),其中包含格式为“yyyy/MM/dd HH:mm:ss”的日期 (eventdt)。
在我相应的休眠类中,我有一个 Date 变量,它将存储 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 安装,重新启动,重新创建域,再次清除缓存,并进行了相同的重建/重新部署。
我还尝试更改代码本身。我想也许这可能是一个线程问题,所以我将变量更改为 static final:
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.");
}