0

我在调试的应用程序中遇到了一个令人沮丧的静态变量问题(我自己没有编写代码)。

我有一个名为 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.");
    }
4

1 回答 1

3

NetBeans 不太可能是罪魁祸首。我猜想问题出在部署中,很可能是静态日期格式编译成的 jar 没有被部署。

您也可以在类路径中的某个地方拥有那个 jar,它会被拾取而不是您更改的那个。

另一种可能性是这不是负责日期的日期格式化程序。我会在行上放一个断点,看看你是否击中它。如果你真的击中它,它是否使用了正确的格式字符串?

于 2012-05-30T16:21:51.367 回答