当前位置:编程学习 > JAVA >>

java日期格式问题,求大神帮助(或许你没发现过的问题)

发现问题的原因:
之前数据生成NC文件,其中将日期转成long型,用于以后取时好比较和求差
在做数据校验时,发现有部分日期和数据库里对不上,仔细检验后发现时将日期转成long再转回来时日期不对了。。。
测试代码如下:
leDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
String date = "1986-05-04 00:00:00";
//date = "1989-04-16 00:00:00";
//date = "1990-04-15 00:00:00";
//date = "1991-04-14 00:00:00";
//date = "1988-04-10 00:00:00";
//date = "1987-04-12 00:00:00";
//date = "1986-05-04 00:00:00";
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(calendar.getTimeInMillis());
System.out.println(sdf.format(new Date(calendar.getTimeInMillis())));




以上的日期都不对 
出来后 都是 yyyy-MM-dd 01:00:00 
而且long型的值也是和01时的一样


1986-05-04 00:01:00比1986-05-04 01:00:00转成long型值还大


求解决啊! --------------------编程问答-------------------- 求帮助啊! --------------------编程问答-------------------- 肯定是用Calendar类时,时间格式不一样导致的,这样写就没问题
package com.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test3 {

public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1 = "1986-05-04 00:00:00";
String date2 = "1986-05-04 00:00:00";
String date3 = "1987-04-12 00:00:00";
String date4 = "1988-04-10 00:00:00";
String date5 = "1989-04-16 00:00:00";
String date6 = "1990-04-15 00:00:00";
String date7 = "1991-04-14 00:00:00";
Date d1 = null;
Date d2 = null;
Date d3 = null;
Date d4 = null;
Date d5 = null;
Date d6 = null;
Date d7 = 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 (ParseException e) {
e.printStackTrace();
}
System.out.println(d1.getTime());
System.out.println(sdf.format(new Date(d1.getTime())));
System.out.println(d2.getTime());
System.out.println(sdf.format(new Date(d2.getTime())));
System.out.println(d3.getTime());
System.out.println(sdf.format(new Date(d3.getTime())));
System.out.println(d4.getTime());
System.out.println(sdf.format(new Date(d4.getTime())));
System.out.println(d5.getTime());
System.out.println(sdf.format(new Date(d5.getTime())));
System.out.println(d6.getTime());
System.out.println(sdf.format(new Date(d6.getTime())));
System.out.println(d7.getTime());
System.out.println(sdf.format(new Date(d7.getTime())));

}
}
--------------------编程问答-------------------- 输出结果是
515520000000
1986-05-04 01:00:00
515520000000
1986-05-04 01:00:00
545155200000
1987-04-12 01:00:00
576604800000
1988-04-10 01:00:00
608659200000
1989-04-16 01:00:00
640108800000
1990-04-15 01:00:00
671558400000
1991-04-14 01:00:00
--------------------编程问答--------------------
引用 3 楼 a470577391 的回复:
输出结果是
515520000000
1986-05-04 01:00:00
515520000000
1986-05-04 01:00:00
545155200000
1987-04-12 01:00:00
576604800000
1988-04-10 01:00:00
608659200000
1989-04-16 01:00:00
640108800000
1990-04-15 01:00:00
671558400000
1991-04-14 01: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 时就已经将值改变了   --------------------编程问答-------------------- 试了下
 String date1 = "1986-05-03 00:00:00";
 String date2 = "1986-05-04 00:00:00";
 String date3 = "1986-05-04 24:00:00";
输出
Sat May 03 00:00:00 CST 1986
Sun May 04 01:00:00 CDT 1986
Mon May 05 00:00:00 CDT 1986
3号TMD还是正常的 ,奇怪,顶下 --------------------编程问答-------------------- lz是不是把几个不正常的日期单独拿出来了,其余日期大多都是正常的 --------------------编程问答--------------------
引用 9 楼 wangjin9805 的回复:
lz是不是把几个不正常的日期单独拿出来了,其余日期大多都是正常的
应该是跟闰秒这个东西有关的,但具体的关系还没搞清楚 --------------------编程问答--------------------
引用 9 楼 wangjin9805 的回复:
lz是不是把几个不正常的日期单独拿出来了,其余日期大多都是正常的


没办法啊,正好碰到这个问题了!
因为我们的很多数据都是实时存的,每个小时都有,近期把数据生成文件,在文件中用long存
生成完之后现在要做数据对比(同数据库),因为是再把long转成date对比,所以出错了。。。
幸亏是long转成date要不还真没发现! --------------------编程问答-------------------- 今天发现这么比较,就小一个小时。。。无奈啊!

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
String date = "1986-05-03 23:00:00";

try {
   calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
   e.printStackTrace();
}

SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar3 = Calendar.getInstance();
String date3 = "1986-05-04 23:00:00";

try {
   calendar3.setTime(sdf3.parse(date3));
} catch (ParseException e) {
   e.printStackTrace();
}
long r = (calendar3.getTimeInMillis()-calendar.getTimeInMillis());
System.out.println("值:"+r + "---" + (r/(60*60*1000))); --------------------编程问答-------------------- 求大神解决啊! --------------------编程问答-------------------- 除
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,