问题描述
发现问题的原因:之前数据生成NC文件,其中将日期转成long型,用于以后取时好比较和求差在做数据校验时,发现有部分日期和数据库里对不上,仔细检验后发现时将日期转成long再转回来时日期不对了。。。测试代码如下:leDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Calendarcalendar=Calendar.getInstance();Stringdate="1986-05-0400:00:00";//date="1989-04-1600:00:00";//date="1990-04-1500:00:00";//date="1991-04-1400:00:00";//date="1988-04-1000:00:00";//date="1987-04-1200:00:00";//date="1986-05-0400:00:00";try{calendar.setTime(sdf.parse(date));}catch(ParseExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}System.out.println(calendar.getTimeInMillis());System.out.println(sdf.format(newDate(calendar.getTimeInMillis())));以上的日期都不对出来后都是yyyy-MM-dd01:00:00而且long型的值也是和01时的一样1986-05-0400:01:00比1986-05-0401:00:00转成long型值还大求解决啊!
解决方案
解决方案二:
求帮助啊!
解决方案三:
肯定是用Calendar类时,时间格式不一样导致的,这样写就没问题packagecom.test;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTest3{publicstaticvoidmain(String[]args){SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Stringdate1="1986-05-0400:00:00";Stringdate2="1986-05-0400:00:00";Stringdate3="1987-04-1200:00:00";Stringdate4="1988-04-1000:00:00";Stringdate5="1989-04-1600:00:00";Stringdate6="1990-04-1500:00:00";Stringdate7="1991-04-1400:00:00";Dated1=null;Dated2=null;Dated3=null;Dated4=null;Dated5=null;Dated6=null;Dated7=null;try{d1=sdf.parse(date1);d2=sdf.parse(date2);d3=sdf.parse(date3);d4=sdf.parse(date4);d5=sdf.parse(date5);d6=sdf.parse(date6);d7=sdf.parse(date7);}catch(ParseExceptione){e.printStackTrace();}System.out.println(d1.getTime());System.out.println(sdf.format(newDate(d1.getTime())));System.out.println(d2.getTime());System.out.println(sdf.format(newDate(d2.getTime())));System.out.println(d3.getTime());System.out.println(sdf.format(newDate(d3.getTime())));System.out.println(d4.getTime());System.out.println(sdf.format(newDate(d4.getTime())));System.out.println(d5.getTime());System.out.println(sdf.format(newDate(d5.getTime())));System.out.println(d6.getTime());System.out.println(sdf.format(newDate(d6.getTime())));System.out.println(d7.getTime());System.out.println(sdf.format(newDate(d7.getTime())));}}
解决方案四:
输出结果是5155200000001986-05-0401:00:005155200000001986-05-0401:00:005451552000001987-04-1201:00:005766048000001988-04-1001:00:006086592000001989-04-1601:00:006401088000001990-04-1501:00:006715584000001991-04-1401:00:00
解决方案五:
引用3楼a470577391的回复:
输出结果是5155200000001986-05-0401:00:005155200000001986-05-0401:00:005451552000001987-04-1201:00:005766048000001988-04-1001:00:006086592000001989-04-1601:00:006401088000001990-04-1501:00:006715584000001991-04-1401:00:00
额,看错了,怎么都多了1个小时。。。
解决方案六:
刚试了下,果然是多一小时而且只在00时和24时出错问题在这一步产生的sdf.parse(date)
解决方案七:
Calendar类子类的日历解释日期根据特定的日历系统规则。像其他的locale敏感类,日历提供了一个类的方法,getInstance,获得一般使用该类的默认实例。日历的getInstance方法返回一个日历的现场是基于系统设置的时间域已与当前的日期和时间初始化:日历现在getinstance()=日历。
解决方案八:
引用6楼AA5279AA的回复:
Calendar类子类的日历解释日期根据特定的日历系统规则。像其他的locale敏感类,日历提供了一个类的方法,getInstance,获得一般使用该类的默认实例。日历的getInstance方法返回一个日历的现场是基于系统设置的时间域已与当前的日期和时间初始化:日历现在getinstance()=日历。
出错是在sdf.parse(date),还没到Calendar,在parse时就已经将值改变了
解决方案九:
试了下Stringdate1="1986-05-0300:00:00";Stringdate2="1986-05-0400:00:00";Stringdate3="1986-05-0424:00:00";输出SatMay0300:00:00CST1986SunMay0401:00:00CDT1986MonMay0500:00:00CDT19863号TMD还是正常的,奇怪,顶下
解决方案十:
lz是不是把几个不正常的日期单独拿出来了,其余日期大多都是正常的
解决方案十一:
引用9楼wangjin9805的回复:
lz是不是把几个不正常的日期单独拿出来了,其余日期大多都是正常的
应该是跟闰秒这个东西有关的,但具体的关系还没搞清楚
解决方案十二:
引用9楼wangjin9805的回复:
lz是不是把几个不正常的日期单独拿出来了,其余日期大多都是正常的
没办法啊,正好碰到这个问题了!因为我们的很多数据都是实时存的,每个小时都有,近期把数据生成文件,在文件中用long存生成完之后现在要做数据对比(同数据库),因为是再把long转成date对比,所以出错了。。。幸亏是long转成date要不还真没发现!
解决方案十三:
今天发现这么比较,就小一个小时。。。无奈啊!SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Calendarcalendar=Calendar.getInstance();Stringdate="1986-05-0323:00:00";try{calendar.setTime(sdf.parse(date));}catch(ParseExceptione){e.printStackTrace();}SimpleDateFormatsdf3=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Calendarcalendar3=Calendar.getInstance();Stringdate3="1986-05-0423:00:00";try{calendar3.setTime(sdf3.parse(date3));}catch(ParseExceptione){e.printStackTrace();}longr=(calendar3.getTimeInMillis()-calendar.getTimeInMillis());System.out.println("值:"+r+"---"+(r/(60*60*1000)));
解决方案十四:
求大神解决啊!