博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Parse字符串为时间一次被坑经历
阅读量:6915 次
发布时间:2019-06-27

本文共 2360 字,大约阅读时间需要 7 分钟。

   在Java代码中发现一个bug,就是本来更新为时间的内容更新为一些奇怪的内容,比如20819这种形式,本来更新的时间都是近期不会超过一年,

为什么会出现这种情况,非常奇怪,遂调试下代码,跟踪发现要匹配的字符串内容和预想的日期格式不符合,代码处理这种情况是抛出异常,

然后用今天的日期替代,结果没成功,代码大概如下:

1         String dt = "20160901"; 2         SimpleDateFormat dateFm = new SimpleDateFormat("yyyyMM"); 3         Date strSuffix = null; 4         try{ 5               strSuffix = dateFm.parse(dt); 6         } catch(Exception e){ 7             strSuffix = new Date(); 8             e.printStackTrace(); 9         }10 11         System.out.println("result date:"+strSuffix.toLocaleString());

按照本来的思路,应该是解析发生异常,然后时间为当前时间,结果打印为:2091-1-1 0:00:00

可见,就算格式和实际的不符合,也不会抛出异常,仔细检查后发现,0901也当做月份来处理,即901,然后除12的话,等于75,再加上年份2016,

刚好是2091年,这个确实和我们的预期不符,所以在做这类转化前最好确认下位数防止这种奇怪的现象。

 

后来了解到SimpleDateFormat的生成开销比较大,尽量少用,而且不是线程安全的函数,如果网上提供了一个高效的用法:

package com.peidasoft.dateformat;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class ThreadLocalDateUtil {    private static final String date_format = "yyyy-MM-dd HH:mm:ss";    private static ThreadLocal
threadLocal = new ThreadLocal
(); public static DateFormat getDateFormat() { DateFormat df = threadLocal.get(); if(df==null){ df = new SimpleDateFormat(date_format); threadLocal.set(df); } return df; } public static String formatDate(Date date) throws ParseException { return getDateFormat().format(date); } public static Date parse(String strDate) throws ParseException { return getDateFormat().parse(strDate); } }

  或者

package com.peidasoft.dateformat;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class ConcurrentDateUtil {    private static ThreadLocal
threadLocal = new ThreadLocal
() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; public static Date parse(String dateStr) throws ParseException { return threadLocal.get().parse(dateStr); } public static String format(Date date) { return threadLocal.get().format(date); }}

  说明:使用ThreadLocal, 也是将共享变量变为独享,线程独享肯定能比方法独享在并发环境中能减少不少创建对象的开销。如果对性能要求比较高的情况下,一般推荐使用这种方法。

 

转载地址:http://fjacl.baihongyu.com/

你可能感兴趣的文章
千万级规模高性能、高并发的网络架构经验分享
查看>>
【css技能提升】css高级技巧
查看>>
Java设计模式--装饰器模式到Java IO 流
查看>>
Java设计模式--代理模式+动态代理+CGLib代理
查看>>
vsCode快捷键设置
查看>>
vscode wechat settings.json
查看>>
poj 2112
查看>>
PHP中文乱码解决方案
查看>>
修改ranger ui的admin用户登录密码踩坑小记
查看>>
数组的方法(下)
查看>>
onethink 换空间报错 解决方案
查看>>
yii2-basic后台管理功能开发之一:引入模板
查看>>
myeclipse重写快捷键
查看>>
BI中的报表业务功能授权使用"自定义主题"
查看>>
day33-mysql库操作
查看>>
01-django第一个实例
查看>>
<转>HTML+CSS总结/深入理解CSS盒子模型
查看>>
Android官方命令深入分析之AVD Manager
查看>>
枚举类型
查看>>
第一次sprint团队贡献分改
查看>>