Java / MySQL时间戳差异,可能的时区问题?

时间:2015-03-02 08:17:38

标签: java mysql date timezone

我正在编写一个方法来确定自上次查看以来是否修改了mysql表,以防止必须再次加载它。我已经能够获得最后修改时间并将其与我当前时间进行比较,但不幸的是,sql server比我提前3小时,它会导致问题。请参阅下面的代码。谢谢。

private Boolean needsToBeRefreshed(Connection conn, String ID) {
    try {
        Statement sta3 = conn.createStatement();
        ResultSet rs =
            sta3.executeQuery("show table status from " + database + " like '" + ID + "'");
        rs.next();
        Date lastmod = rs.getTimestamp("Update_time");
        System.out.println("SQL " + lastmod);
        sta3 = conn.createStatement();
        Calendar calGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        Date now = calGMT.getTime();
        System.out.println("ID: " + ID);
        System.out.println("Last refreshed: " + lastModifiedMap.get(ID) + " Last modified: " + lastmod);
        if (lastModifiedMap.get(ID) == null || lastmod.after(lastModifiedMap.get(ID))) {
            System.out.println(now);
            lastModifiedMap.put(ID,now);
            System.out.println("Accepted");
            return true;
        }
    } catch (SQLException e) {
        e.printStackTrace();
        System.out.println("SQL exception");
        System.out.println("Accepted");
        return true;
    }
    System.out.println("Rejected");
    return false;
}

}

产生以下输出:

SQL 2015-03-02 02:57:57.0
ID: Testunits
Last refreshed: null Last modified: 2015-03-02 02:57:57.0
Mon Mar 02 00:11:55 PST 2015
Accepted

然后是第二次贯穿:

SQL 2015-03-02 02:57:57.0
ID: Testunits
Last refreshed: Mon Mar 02 00:11:55 PST 2015 Last modified: 2015-03-02 02:57:57.0
Mon Mar 02 00:12:43 PST 2015
Accepted

我一直在网上搜索并认识到Date类不依赖于时区...我觉得这是因为SQL服务器设置为不同的时区而java不知道它。所以我的问题可能就像如何获取sql server的时区并将其应用于日期一样简单。或者,如果SQL服务器具有上次修改的非时区特定时间戳...

任何帮助将不胜感激。谢谢!

编辑:

评论后我改变了我的代码,将我的“现在”时间创建为日历,并更改了输出以显示时间值。请参阅上面的编辑以进行新初始新产出如下:

SQL 2015-03-02 02:57:58.0
ID: Testunits
Last refreshed: 1425286285712 Last modified: 1425293878000
Mon Mar 02 00:51:30 PST 2015
Accepted

据我所知,我的“现在”时间必须是正确的,与时区无关,但是sql server返回的时间仍然是几个小时。

我该如何弥补这个?

编辑2:

想出来!答案确实最终帮助了我。谢谢。

private Boolean checkLastModified(Connection conn, String ID) {
    try {
        Statement sta3 = conn.createStatement();
        ResultSet rs =
            sta3.executeQuery("show table status from " + database + " like '" + ID + "'");
        rs.next();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("EST"));
        Date lastmod = dateFormat.parse(rs.getString("Update_time"));
        sta3 = conn.createStatement();
        Calendar calGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        Date now = calGMT.getTime();
        if (lastModifiedMap.get(ID) == null || lastmod.after(lastModifiedMap.get(ID))) {
            System.out.println(now);
            lastModifiedMap.put(ID,now);
            return true;
        }

    } catch (SQLException e) {
        System.out.println("SQL exception");
        return true;
    } catch (ParseException e) {
        System.out.println("Parse exception");
        return true;
    }
    return false;
}
}

0 个答案:

没有答案