Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC时间戳&;格林尼治标准时间发行日期_Java_Sql_Jdbc_Gmt - Fatal编程技术网

Java JDBC时间戳&;格林尼治标准时间发行日期

Java JDBC时间戳&;格林尼治标准时间发行日期,java,sql,jdbc,gmt,Java,Sql,Jdbc,Gmt,我有一个JDBC日期列,如果我使用getDate,则只获取“日期”部分2009年10月02日,但如果我使用getTimestamp,则获取完整的“日期”2009年10月02日13:56:78:890。这绝对是我想要的 但是,getTimestamp返回的“日期”忽略了GMT值,假设是日期2009年10月02日13:56:78:890,我最终得到了2009年10月02日15:56:78:890 我的日期在数据库上保存为+2GMT日期,但应用程序服务器在GMT上,即落后2小时 怎样才能让我的约会保持

我有一个JDBC日期列,如果我使用getDate,则只获取“日期”部分2009年10月02日,但如果我使用getTimestamp,则获取完整的“日期”2009年10月02日13:56:78:890。这绝对是我想要的

但是,getTimestamp返回的“日期”忽略了GMT值,假设是日期2009年10月02日13:56:78:890,我最终得到了2009年10月02日15:56:78:890

我的日期在数据库上保存为+2GMT日期,但应用程序服务器在GMT上,即落后2小时

怎样才能让我的约会保持原样,2009年10月02日13:56:78:890

编辑


我在客户端获得了日期+2,即GMT+2

您应该知道
java.util.date
(以及
java.sql.date
java.sql.Timestamp
,它们是
java.util.date
的子类)对时区一无所知,或者更确切地说,它们总是在UTC

java.util.Date
及其子类只不过是“自1970年1月1日起的毫秒数,UTC上午12:00”值的容器

要显示特定时区中的日期,请使用
java.text.DateFormat
对象将其转换为字符串。通过调用
setTimeZone()
方法设置该对象的时区。例如:

Date date = ...;  // wherever you get this from

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Make the date format show the date in CET (central European time)
df.setTimeZone(TimeZone.getTimeZone("CET"));

String text = df.format(date);

这就是时间戳和MySQL中其他时态类型的区别。时间戳以UTC格式保存为Unix time\t,但其他类型按字面形式存储日期/时间,不包含区域信息

调用getTimestamp()时,MySQL JDBC驱动程序会将GMT中的时间转换为默认时区(如果类型为timestamp)。它不会对其他类型执行此类转换

您可以更改列类型,也可以自己进行转换。我推荐前一种方法

由此我得出结论,JDBC确实为时间戳检索时区(我认为MS SQL也不支持这一点,大多数Google结果都指向Oracle)

调用JDBC getTimeStamp方法时,它只获取“毫秒”部分,并使用服务器时区(即GMT)创建一个日期对象

当这个日期对象呈现给我的客户时,它是+2 GMT,它会增加2小时,这是导致额外小时数的标准偏移量


我已通过删除检索日期的时间偏移量(即转换为真正的GMT日期)来纠正此问题。

前几天,我遇到了类似的问题,其中时间部分被从某些日期截断

我们将其缩小到Oracle驱动程序版本的差异

在Oracle的常见问题解答中,有一节介绍了这一点:


在9201之前,这将返回:
getObject for sysdate:java.sql.Timestamp关键字转换,这就是我得到+2小时的原因我很困惑,如果转换工作正常,他不应该看到一个少于2小时而不是更多的日期吗?这已经足够接近了,并引导我找到了最终的解决方案
select sysdate from dual; ...while(rs.next())
java.util.Properties prop=newjava.util.Properties(); 
prop.put("oracle.jdbc.V8Compatible","true"); 
prop.put("user","scott"); 
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid"; 
Connection conn = DriverManager.getConnection(url,prop);
import java.util.Date; 
Date d = rs.getDate(1);
private Date convertDate(Date date1) throws ParseException {
        SimpleDateFormat sdfFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdfFormatter.format(date1);
        SimpleDateFormat sdfParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdfParser.setTimeZone(TimeZone.getTimeZone("GMT"));
        return sdfParser.parse(dateStr);
    }