各位大虾好,目前我们公司生产库出现极少数的日期解析成1970年的问题,有年份解析错误的,有年月解析错误的,也有年月日都解析错误的。
查看xml报文,时间是2012-5-26,但解析的结果却是1970-5-26 我们解析的方法是这样的:
DateFormat dateForm = new SimpleDateFormat("yyyy-mm-dd");
Date d = dateForm.parse(date);
而这个date是其它系统传过来的字符串。 感觉好奇怪的,99.9%是正确的,几千万的数据就那么几十条有问题,不知道怎么回事。 哪位能指点下原因不?
查看xml报文,时间是2012-5-26,但解析的结果却是1970-5-26 我们解析的方法是这样的:
DateFormat dateForm = new SimpleDateFormat("yyyy-mm-dd");
Date d = dateForm.parse(date);
而这个date是其它系统传过来的字符串。 感觉好奇怪的,99.9%是正确的,几千万的数据就那么几十条有问题,不知道怎么回事。 哪位能指点下原因不?
解决方案 »
- 处理excel文件
- 求推荐开源的cms系统,谢谢
- 一个jsp的sendRedirect的问题!
- 图片的裁减问题,高手进
- java 二进制数据转换为字符串
- The hierarchy of the type IndexController is inconsistent
- web services查询数据库,怎么将该数据集回传客户端?(客户端为.net C#)
- resin和iis集成的问题
- 为什么在客户端可以调用在EJB的Remote接口和Home接口中没有定义,而在bean中有定义的方法?
- 大量数据交换适合不适合用J2EE?
- what is "Must Understand check failed for header"error?
- 有关JMX的一些问题
Date d = dateForm.parse("2012-5-26");
你Pattern写错了 。yyyy-mm-dd
小写 mm 表示分
大写 MM 才是月
应该是 yyyy-MM-dd
SimpleDateFormat不是线程安全的,如果多线程访问同一个SimpleDateFormat对象就会出错。我曾经写过一个多线程导数据的程序,结果下单时间比支付时间还晚,后来才发现是这个问题。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 线程安全的SimpleDateFormat帮助类<br/>
* 创建SimpleDateFormat对象成本较高,但是SimpleDateFormat又不是线程安全的,因此使用ThreadLocal模式<br/>
*
* @author xujsh([email protected])
*
* */
public class DateFormatUtil {
public static final String PATTERN10 = "yyyy-MM-dd";
public static final String PATTERN19 = "yyyy-MM-dd HH:mm:ss";
private static final ThreadLocal<Map<String,SimpleDateFormat>> DATE_FORMAT_HOLDER = new ThreadLocal<Map<String,SimpleDateFormat>>(){
@Override
protected Map<String, SimpleDateFormat> initialValue() {
Map<String, SimpleDateFormat> map = new HashMap<String, SimpleDateFormat>();
map.put(PATTERN10, new SimpleDateFormat(PATTERN10));
map.put(PATTERN19, new SimpleDateFormat(PATTERN19));
return map;
}
};
private DateFormatUtil(){
//私有的构造函数
}
/**
* 获取符合pattern格式的SimpleDateFormat对象<br/>
* 如果pattern格式的SimpleDateFormat对象不存在,会创建并缓存之<br/>
*
* @param pattern
* @return
* */
public static SimpleDateFormat getDateFormat(String pattern){
Map<String, SimpleDateFormat> map = DATE_FORMAT_HOLDER.get();
SimpleDateFormat sdf = map.get(pattern);
if(sdf == null){
sdf = new SimpleDateFormat(pattern);
map.put(pattern, sdf);
}
return sdf;
}
/**
* 获取yyyy-MM-dd格式的SimpleDateFormat对象
*
* @return
* */
public static SimpleDateFormat getDateFormat10(){
return getDateFormat(PATTERN10);
}
/**
* 获取yyyy-MM-dd HH:mm:ss格式的SimpleDateFormat对象
*
* @return
* */
public static SimpleDateFormat getDateFormat19(){
return getDateFormat(PATTERN19);
}
/**
* 把日期格式化成yyyy-MM-dd字符串
*
* @param date
* @return
* */
public static String format10(Date date){
if(date == null){
return "";
}
return getDateFormat10().format(date);
}
/**
* 把日期格式化成yyyy-MM-dd HH:mm:ss字符串
*
* @param date
* @return
* */
public static String format19(Date date){
if(date == null){
return "";
}
return getDateFormat19().format(date);
}
/**
* 把yyyy-MM-dd格式的字符串转化成日期
*
* @param datestr
* @return
* */
public static Date parse10(String datestr){
if(datestr == null || datestr.length()!=10){
return null;
}
try{
return getDateFormat10().parse(datestr);
}catch(Exception e){
return null;
}
}
/**
* 把yyyy-MM-dd HH:mm:ss格式的字符串转化成日期
*
* @param datestr
* @return
* */
public static Date parse19(String datestr){
if(datestr == null || datestr.length() != 19){
return null;
}
try{
return getDateFormat19().parse(datestr);
}catch(Exception e){
return null;
}
}
}