夏令时转冬令时问题请教

muiz 2007-07-23 12:13:14
现在我们有一个CS的系统(C: java, S: Oracle). 在下个月要把时间从夏令时转冬令时.

由于之前没有考虑这个问题, 所以程序中都是不分时区的.

请问大家有没有遇到这个问题? 并有什么解决建议? 包括前台的java时间,如何保存这些信息, 后台Oracle如何处理等. 谢谢!!
...全文
2213 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
muiz 2007-07-24
  • 打赏
  • 举报
回复
对不起, 结果是不对了. 数据库时间01-12月-99 11.00.00.000000 上午 +09:00
返回的时间却还是-8, 也就是一直是本地时间. getTimezoneOffset() 这个是静态方法. :(
muiz 2007-07-24
  • 打赏
  • 举报
回复
shan1119(大天使,卐~解!):
ResultSet.getTimestamp().getTimezoneOffset(): The method getTimezoneOffset() from the type Date is deprecated. 这个方法不推荐了.

我测试: 数据时间是: 01-12月-99 11.00.00.000000 上午 -08:00
System.out.println("getTimezoneOffset: " + ResultSet.getTimestamp().getTimezoneOffset().getTimezoneOffset() / 60);
打印出来是:
getTimezoneOffset: -8

结果是对的.
shan1119 2007-07-24
  • 打赏
  • 举报
回复
ResultSet.getTimestamp().getTimezoneOffset()

Time,Timezone都可以取到,然后剩下的可以用Calendar类来实现吧.
Calendar.setTime()
Calendar.setTimeZone()
Calendar.add(Calendar.DATE, 1);//or -1

不知道会不会有问题.
muiz 2007-07-24
  • 打赏
  • 举报
回复
呵呵, 谢谢!
shan1119 2007-07-24
  • 打赏
  • 举报
回复
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/SimpleDateFormat.html#rfc822timezone

再给个参考资料,你自己慢慢折腾吧,或许能用上,看你自己的了 :)
muiz 2007-07-24
  • 打赏
  • 举报
回复
数据库的格式是一样的, 就是不知道ResultSet.getString(index), 对于不同数据库或不同的JDBC的版本.这个tostring的结果是不相同的我想, 至少不是都相同. 说这个方法不好. 如果实在没有办法, 就这么搞了 :(
shan1119 2007-07-24
  • 打赏
  • 举报
回复
取到的数据格式不一样吗.如果没统一格式的话很难写,倒是有了格式会方便许多.

而且从数据库里读出来的数据应该是统一格式的,要是不统一的话,不论你怎么做都会很麻烦.
muiz 2007-07-24
  • 打赏
  • 举报
回复
比如: ResultSet.getString(index), 结果是:
1999-12-1 11.0.0.0 -8:0

这样可以取得timezone的信息, 可是这样去处理不好吧?
shan1119 2007-07-24
  • 打赏
  • 举报
回复
哦,取字符串啊,没注意到.
要是那样的话可以截取字符串,它的格式是一定的,应该能取得到.
String zone = rs.getString("t").substring(29);

这块改成这个,就不用加那个sql了.
muiz 2007-07-24
  • 打赏
  • 举报
回复
我这里不可以, 原因一个是这已经是一个运行的系统了. 设计开始的时候没有考虑这个问题, 所以现在才来改, 下个月就要夏冬令时转换. 二是这里的时间会有很多计算, 所以不把时间保存成字符串, 计算的时候再转换成时间. Oracle这边应该是没有什么问题了. 主要是JAVA这边 :(, 首先就是JDBC, 然后是我们系统自己的一些修改.
比特灵 2007-07-24
  • 打赏
  • 举报
回复
我用ORACLE的时候时间保存成字符的,感觉很方便。
muiz 2007-07-24
  • 打赏
  • 举报
回复
shan1119, 好像是的. 但是我奇怪的就是ResultSet.getString(index)可以看到正确的时区, getTimestamp或其他的就不可以
shan1119 2007-07-24
  • 打赏
  • 举报
回复
如果你想在java里直接从取到的Timestamp中得到timezone的信息好象不可能,我看了下Timestamp的构造方法,好象没有timezone的信息.
muiz 2007-07-24
  • 打赏
  • 举报
回复
shan1119(大天使,卐~解!), 谢谢! 这样是可以得到timezone, 但是SQL都不可能写个TO_char(t,'TZH:TZM') 在查询语句中啊. 所以这不是个好办法:)
shan1119 2007-07-24
  • 打赏
  • 举报
回复
看看有没有帮助.
shan1119 2007-07-24
  • 打赏
  • 举报
回复
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@10.201.147.209:1521:chuden";
Connection conn= DriverManager.getConnection(url,"gyomu","gyomu");
Statement stmt=conn.createStatement();

StringBuffer sql = new StringBuffer();
sql.append(" select t,TO_char(t,'TZH:TZM') zone from tbltest");

ResultSet rs = stmt.executeQuery(sql.toString());

while(rs.next()){
Timestamp t = rs.getTimestamp("t");
String zone = rs.getString("zone");
Calendar c = Calendar.getInstance();
c.setTime(t);
TimeZone tz = TimeZone.getTimeZone("GMT"+zone);

c.setTimeZone(tz);
System.out.println(c.getTimeZone());
}

}catch(Exception e){
e.printStackTrace();
}
shan1119 2007-07-23
  • 打赏
  • 举报
回复
不懂,什么是夏令时,冬令时?专业术语吗?
muiz 2007-07-23
  • 打赏
  • 举报
回复
系统时间当然要改了. 但是还是会有问题:
在夏令时改成冬令时的时候, 是时间往后推一个小时.
比如现在是夏令时8月1日00:00, 然后转到冬令时的时候, 要再向后推一个小时, 要从7月31日23:00开始计时. 所以要保证这一个小时的数据的正确性,或要可区分是夏令时的11点还是冬令时的11点.明白?
myydzhz 2007-07-23
  • 打赏
  • 举报
回复
为什么不直接改系统时间?
muiz 2007-07-23
  • 打赏
  • 举报
回复
sureyor():
ResultSet.getString(index) 这个可以把timezone的正确信息打印出来,比如:
1999-12-1 11.0.0.0 -8:0

可是我想得到的是一个时间对象, 而不是一个字符串.
加载更多回复(11)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧