2 customer viper customer_viper 于 2015.06.26 15:32 提问

为何指定时间加上1小时,个别会出错?

为了说明问题,请看下面一小段代码
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Cs {
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date d = format.parse("1986-09-13 21:00:00");
Calendar c = Calendar.getInstance();
for(int i=0;i<5;i++){
c.setTime(d);
c.add(Calendar.HOUR_OF_DAY, 1);
Timestamp ts = new Timestamp(c.getTimeInMillis());
d=ts;
System.out.println(ts);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

运行结果为
1986-09-13 22:00:00.0

1986-09-13 23:00:00.0

1986-09-13 23:00:00.0

1986-09-14 00:00:00.0
1986-09-14 01:00:00.0

为何第一次 1986-09-13 23:00:00.0没有变化
谢谢!

2个回答

tongyi55555
tongyi55555   2015.06.26 16:17
已采纳

先说解决办法吧,使用SimpleDateFormat的时候要加上时区,比如你的代码加上这一句就没有问题了:

format.setTimeZone(TimeZone.getTimeZone("GMT+8"));

再说原因:
你挑的这个时间跟夏令时有关,你可以看下这里关于中国实行夏令时的日期说明:
http://www.qingyunju.com/name/xiashizhi.htm

你的时间正好是夏令时与正常时间切换的点,上面的链接中说我国是从凌晨2时开始算,但貌似java中直接按日期算了,没有精确到时,你可以试试其他几个实行夏令时的年份。
具体的源代码我还没有找到。有了我再告诉你。

customer_viper
customer_viper 谢谢,终于知道原因了,谢谢哥们!
大约 3 年之前 回复
tongyi55555
tongyi55555   2015.06.27 11:47

你可以看看这篇文章,具体介绍了在哪里初始化这些夏令时日期的,根据我们系统的时区会进行初始化,这些已经在JDK中写死了。参考下面的链接:
http://blog.csdn.net/java2000_net/article/details/4362316

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
php如何在某个时间上加一天?一小时?一星期?一个月?
php如何在某个时间上加一天?一小时?一星期?一个月?<?phpdate_default_timezone_set('PRC'); //默认时区echo "今天:",date("Y-m-d",time()),"<br>"; echo "今天:",date("Y-m-d",strtotime("18 june 2008")),"<br>";echo "昨天:",date("Y-m-d",strtoti
sql语句把某一个时间添加1分钟,一小时等
<br />update dbo.Assessdata_01 set PointTime=DATEADD(n, -1, PointTime)
MySQL 为日期增加一个时间间隔
MySQL 为日期增加一个时间间隔:date_add() set @dt = now(); select date_add(@dt, interval 1 day);   - 加1天 select date_add(@dt, interval 1 hour);   -加1小时 select date_add(@dt, interval 1 minute);    - 加1分
linux shell 再指定日期上增加或者减去一小时或者一分钟
在指定的日期上减去指定的天 [dc@dc010.tj.momo.com init_env]$ date -d "20150416 12 3 days" +"%Y%m%d%H" 2015041912 在指定的日期上加上指定的小时 [dc@dc010.tj.momo.com init_env]$ date -d "20150416 12 3 hour" +"%Y%m%d%H"
java时间转化类,一小时前,刚刚一个月前
java 时间转化工具,1,刚刚 2,一小时前 3,两小时前 4,一天前 5,两天前 6,三天前
Simpledateformat 多了一小时
如果格式化日期的时候发现时间比真实时间多了一个小时,那么问题是: 引入了错的命名空间了!!! 正确的是:java.text.SimpleDateFormat public static void main(String[] args) { try{ System.out.println(new Date()); java.text.Simple
Java当前时间加1
<br />import java.util.Calendar; import java.util.Date; public class DateAddOne { /** * @param args * 设置当前时间加1 */ public static void main(String[] args) { Calendar c = Calendar.getInstance(); c.setTime(new Date()); //设置当前日期
php 当前日期加一天和指定日期加一天
1.给当前时间加一天?一小时? echo "今天:",date('Y-m-d H:i:s'),""; echo "明天:",date('Y-m-d H:i:s',strtotime('+1 day')); ?> 上一行输出当前时间,下一行输出明天时间 同理加一年,一小时,一分钟 ,一月。。。 echo "明天:",date('Y-m-d H:i:s',strtotime('+1
java获取相对时间 1小时前 1天前
package com.pul.energy.build; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class RelativeDateFormat {     private static final lon
matlab时间加5分钟
datestr(datenum(2001,01,01,23,55,00)+datenum(2001,01,01,12,05,00)-datenum(2001,01,01,12,00,00),'yyyymmddTHHMMSS') datestr(datenum(2001,01,01,23,55,00)+datenum(2001,01,01,12,05,00)-datenum(2001,01,01,