【发布时间】:2014-10-19 22:14:30
【问题描述】:
当我从独立的 JDBC 程序对 SQLite JDBC 驱动程序执行 SQL 语句“SELECT datetime('now', 'localtime')”时,我得到正确的本地时间戳,而当我通过 JSP 页面执行它时,我得到格林威治标准时间/UTC 时间。有人可以解释为什么在 JSP 代码的情况下我会得到 UTC 时间吗?我想要由独立程序给出的当地时间。我确保两者都使用相同的 JDBC 驱动程序 jar 文件“sqlite-jdbc-3.7.2.jar”。
这是独立的 SQLite JDBC 程序:
import java.sql.*;
public class GetTimestamp
{
public static void main(String[] args)
{
Connection conn = null;
PreparedStatement p = null;
ResultSet rs = null;
try {
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:C:/sqlite/db1", null, null);
p = conn.prepareStatement("SELECT datetime('now', 'localtime')");
rs = p.executeQuery();
System.out.println("Current timestamp = " + rs.getString(1));
conn.close();
} catch (SQLException se) {
System.out.println("Error: " + se.toString());
} catch (ClassNotFoundException cnfe) {
System.out.println("Error: " + cnfe.toString());
}
}
}
它的输出:
这是等效的 JSP:
<HTML>
<BODY>
<%@page import="java.sql.*"%>
<%
Connection conn = null;
PreparedStatement p = null;
ResultSet rs = null;
try {
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:C:/sqlite/db1", null, null);
p = conn.prepareStatement("SELECT datetime('now', 'localtime')");
rs = p.executeQuery();
//System.out.println("Current timestamp = " + rs.getString(1));
out.println("Current timestamp = " + rs.getString(1));
conn.close();
} catch (SQLException se) {
//System.out.println("Error: " + se.toString());
out.println("Error: " + se.toString());
} catch (ClassNotFoundException cnfe) {
//System.out.println("Error: " + cnfe.toString());
out.println("Error: " + cnfe.toString());
}
%>
</BODY>
</HTML
它的输出是
【问题讨论】:
-
出于对代码的热爱,总是在
finally块中关闭您的 ResultSet、Statement/PreparedStatement 以及最后的 Connection。在 Java 6 及更高版本(在某些类上)可能不需要它,但它是最佳编程实践。 -
您是否尝试过使用
rs.getDate和SimpleDateFormat?正如你所拥有的那样,你依赖于太多可能的变量。 -
布哈克辛迪,感谢您的建议。我提到的代码只是为了演示问题,而不是最终代码的一部分,它将处理您提到的问题。
-
OldCurmudgeon,我需要时间戳,而不仅仅是日期。我尝试了以下方法 rs.geTring(1) 是最接近的方法,只是它没有给出与 GMT 偏移 5.30 的时间: rs.getDate(1).toString() = 1970-01-01 rs.getTime(1 ).toString() = 05:30:00 rs.getTimestamp(1).toString() = 1970-01-01 05:30:00.0 rs.getString(1) = 2014-08-27 05:18:06
-
你用的是什么版本的 SQLLite?