SimpleDateFormat 使用潜在危险

本文详细阐述了使用SimpleDateFormat进行日期格式化时,由于格式掩码理解不当导致小时位被置为0,进而引发系统锁机制失效的问题。通过案例分析,揭示了小时位设置为hh与HH的区别,并强调了正确使用格式掩码的重要性。最后,通过实际错误场景解释了问题的隐蔽性及解决策略。

SimpleDateFormat 作为一个日期类型到字符串类型的格式化转换工具,非常好用,一个简单的例子如下:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date now = new Date(); String sDate = sdf.format(now); String date1 = "2011-12-19 12:12:12": Date date = sdf.parse(date1);
这里需要了解格式掩码的含义,若含义没有弄清楚,大小写不区分,则可能导致潜在的隐患。如若格式小时设置为hh,是12小时制,而使用HH则是24小时制。若字符串日期是12小时,则小时位在parse后被置为0,而很多情况下,我们需要的是24小时制,不希望被转换为0。这时若用hh就出问题了。

下面这个例子中小时位是12小时制

SimpleDateFormat sDF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
最近发生在生产上的一个问题是,每天12点时,系统的锁机制失效,导致客户多次提交同一笔交易,造成多次重复记账的严重错误,而这个错误很少出现,曾经在另外一个客户中出过类似的问题,没有找到原因。后来发现该问题只是在12点到13点间发生,而客户在这个时间段很少做交易,故问题很隐蔽,一直没有被发现。

错误的最终原因是12点时,小时位被置为0,日期转换错误,导致应用系统锁机制失效。

另外大写的MM是代表月,小写的mm代表分钟,一旦写错,则日期转换就完全错误了。

public DrugBasic getYpBasic(String key,String valueStr,DrugBasic basic,TSysPerson per){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if(key.equals("b_value_1")){ //抽样计划名称 basic.setLccb_chouyrwly(valueStr); }else if(key.equals("b_value_2")){ //抽样类别 basic.setLccb_jymdxl(valueStr); }else if(key.equals("b_value_3")){ //抽样细类 //basic.setLccb_bsflb(valueStr); }else if(key.equals("b_value_4")){ //统计所属抽样单位 basic.setLccb_cydw(valueStr); Date date = null; try { date = sdf.parse(valueStr); } catch (ParseException e) { e.printStackTrace(); } basic.setLccb_sjrq(date); }else if(key.equals("b_value_5")){ //抽样单位省 basic.setLccb_cydwsheng(valueStr); }else if(key.equals("b_value_6")){ //抽样单位市 basic.setLccb_cydwshi(valueStr); }else if(key.equals("b_value_7")){ //抽样单位县 basic.setLccb_cydwxian(valueStr); }else if(key.equals("b_value_8")){ //抽样单编号 basic.setLccb_chouyjpzbh(valueStr); }else if(key.equals("b_value_9")){ //抽样时间 Date date = null; try { date = sdf.parse(valueStr); } catch (ParseException e) { e.printStackTrace(); } basic.setLccb_cysj(date); }else if(key.equals("b_value_10")){ //抽样单位联系人 basic.setLccb_cydwlxr(valueStr); }else if(key.equals("b_value_11")){ //抽样单位电话 basic.setLccb_cydwdh(valueStr); }else if(key.equals("b_value_12")){ //检验单位 }else if(key.equals("b_value_13")){ //检验单位省 }else if(key.equals("b_value_14")){ //检验单位市 }else if(key.equals("b_value_15")){ //检验单位县 }else if(key.equals("b_value_16")){ //受托抽样单位 basic.setLccb_stdw(valueStr); }else if(key.equals("b_value_17")){ //受托单位省 basic.setLccb_stdwdsheng(valueStr); }else if(key.equals("b_value_18")){ //受托单位市 basic.setLccb_stdwdshi(valueStr); }else if(key.equals("b_value_19")){ //受托单位县 basic.setLccb_stdwdxian(valueStr); }else if(key.equals("b_value_20")){ //检品名称 basic.setLccb_jpmc(valueStr); }else if(key.equals("b_value_21")){ //批号 basic.setLccb_ph(valueStr); }else if(key.equals("b_value_22")){ //剂型 basic.setLccb_yangplx(valueStr); }else if(key.equals("b_value_23")){ //规格型号 basic.setLccb_gg(valueStr); }else if(key.equals("b_value_24")){ //包装规格 basic.setLccb_baozfl(valueStr); }else if(key.equals("b_value_25")){ //生产日期 basic.setLccb_scrq(valueStr); }else if(key.equals("b_value_26")){ //效期月 basic.setLccb_yxqys(valueStr); }else if(key.equals("b_value_27")){ //保质期 basic.setLccb_yxq(valueStr); }else if(key.equals("b_value_28")){ //商品名 basic.setLccb_ypspm(valueStr); }else if(key.equals("b_value_29")){ //是否基药 basic.setLccb_sfjy(valueStr); }else if(key.equals("b_value_30")){ //生产单位 basic.setLccb_scdwname(valueStr); }else if(key.equals("b_value_31")){ //是否基药 basic.setLccb_sfjy(valueStr); }else if(key.equals("b_value_32")){ //生产单位地址 basic.setLccb_scdwdz(valueStr); }else if(key.equals("b_value_33")){ //是否委托加工 basic.setLccb_sfwtjg(valueStr); }else if(key.equals("b_value_34")){ //生产单位省 basic.setLccb_scdwsheng(valueStr); }else if(key.equals("b_value_35")){ //生产单位市 basic.setLccb_scdwshi(valueStr); }else if(key.equals("b_value_36")){ //生产单位县 basic.setLccb_scdwxian(valueStr); }else if(key.equals("b_value_37")){ //被抽样单位 basic.setLccb_bcydw(valueStr); }else if(key.equals("b_value_38")){ //被抽样单位经办人 //basic.setLccb_bcydwjbr(valueStr); }else if(key.equals("b_value_39")){ //被抽样单位联系人 basic.setLccb_bcydwlxr(valueStr); }else if(key.equals("b_value_40")){ //被抽样单位电话 basic.setLccb_bcydwdh(valueStr); }else if(key.equals("b_value_41")){ //被抽样单位邮编 basic.setLccb_bcydwyb(valueStr); }else if(key.equals("b_value_42")){ //被抽样单位省 basic.setLccb_beisydwdz(valueStr); }else if(key.equals("b_value_43")){ //被抽样单位市 basic.setLccb_beisydwdz1(valueStr); /* String[] str = valueStr.split(""); String lysl = ""; for(int i=0;i<str.length;i++){ if(StringUtils.isNotEmpty(str[i])&&(str[i].matches("\\d")||str[i].matches("\\."))){ lysl+=str[i]; }else if(StringUtils.isNotEmpty(str[i])&&!(str[i].matches("\\d")||str[i].matches("\\."))){ break; } } basic.setLccb_lysl(lysl); String lysldw = valueStr.replace(lysl, ""); if(!Util.isEmpty(lysldw)){ basic.setLccb_lysldw(lysldw); }*/ }else if(key.equals("b_value_44")){ //被抽样单位县 basic.setLccb_beisydwdz2(valueStr); }else if(key.equals("b_value_45")){ //被抽样单位地址 basic.setLccb_bcydwdz(valueStr); }else if(key.equals("b_value_46")){ //检品分类大类 basic.setLccb_jymddl(valueStr); }else if(key.equals("b_value_47")){ //检品分类细类 basic.setLccb_jymdxl(valueStr); }else if(key.equals("b_value_48")){ //包装材料 basic.setLccb_chouyypbz(valueStr); }else if(key.equals("b_value_49")){ //抽样环节 basic.setLccb_chouyhuanj(valueStr); }else if(key.equals("b_value_50")){ //被抽样单位类别 basic.setLccb_bcydwxz(valueStr); }else if(key.equals("b_value_51")){ //抽样地 if(!StringUtils.isEmpty(valueStr)) { String[] a = valueStr.split("-"); basic.setLccb_bcydwxz(a[0]); if(a.length>1) { basic.setLccb_cydd(a[1]); } } }else if(key.equals("b_value_52")){ //包装状态 basic.setLccb_chouybzzt(valueStr); }else if(key.equals("b_value_53")){ //包装状态其他 //basic.setLccb_bzztqt(valueStr); }else if(key.equals("b_value_54")){ //样品贮存温度 basic.setLccb_wd(valueStr); }else if(key.equals("b_value_55")){ //样品贮存相对湿度 basic.setLccb_sd(valueStr); }else if(key.equals("b_value_56")){ //抽样数量 basic.setLccb_cysl(valueStr); basic.setLccb_jpsl(valueStr); }else if(key.equals("b_value_57")){ //抽样数量单位 basic.setLccb_cysldw(valueStr); basic.setLccb_jpsldw(valueStr); }else if(key.equals("b_value_58")){ //单价 basic.setLccb_danjia(valueStr); }else if(key.equals("b_value_59")){ //生产配制购进数量 basic.setLccb_jhnum(valueStr); }else if(key.equals("b_value_60")){ //抽样说明 //basic.setLccb_cysm(valueStr); }else if(key.equals("b_value_61")){ //抽样级别 //basic.setLccb_cyjb(valueStr); }else if(key.equals("b_value_62")){ //生产日期 //basic.setLccb_scrq("b_value_62"); }else if(key.equals("b_value_63")){ //抽样单位地址 basic.setLccb_cydwdz(valueStr); }else if(key.equals("b_value_64")){ //批准文号 basic.setLccb_pzwh(valueStr); }else if(key.equals("b_value_65")){ //受托单位地址 basic.setLccb_stdwdz(valueStr); }else if(key.equals("b_value_67")){ try { String fj=""; valueStr = valueStr.replaceFirst(";", ""); for (String val : valueStr.split(";")) { byte[] bytes = stringToBytes(val); System.out.println("^V^"+bytes); String sid = new GUID().toString(); buff2Image(bytes,"D:\\apache-tomcat-7.0.42\\webapps\\glxt_qh\\upload\\"+sid+".jpg"); fj+=",upload/"+sid+".jpg"; } basic.setLccb_fileattach(fj.replaceFirst(",", "")); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else if(key.equals("b_value_68")){ //药品属性 basic.setLccb_ypsx(valueStr); }else if(key.equals("b_value_69")){ //企业属性 basic.setLccb_qysx(valueStr); }else if(key.equals("b_value_71")){ //贮存条件 basic.setLccb_ypztbz(valueStr); }else if(key.equals("b_value_72")){ //包装规格 basic.setLccb_baozfl(valueStr); }else if(key.equals("b_value_73")){ //被抽样单位社会信用代码/组织机构代码 basic.setLccb_bcydwyyzzh(valueStr); }else if(key.equals("b_value_74")){ //该批样品总价 basic.setLccb_ypjg(valueStr); }else if(key.equals("b_value_75")){ //平台名称 basic.setWljyptmc(valueStr); }else if(key.equals("b_value_76")){ //平台统一社会信用代码 basic.setWljytyshxydm(valueStr); }else if(key.equals("b_value_77")){ //法定代表人/主要负责人 basic.setWljyptfrdb(valueStr); }else if(key.equals("b_value_78")){ //电信业务经营许可证号 basic.setWljyptdxxkz(valueStr); }else if(key.equals("b_value_79")){ //平台注册所属省份 basic.setWljypts(valueStr); }else if(key.equals("b_value_80")){ //平台地址 basic.setWljyptdz(valueStr); }else if(key.equals("b_value_81")){ //被抽样单位店铺名称 basic.setWljybcydwdpmc(valueStr); }else if(key.equals("b_value_82")){ //被抽样样品网址 basic.setWljybcyypwz(valueStr); }else if(key.equals("b_value_83")){ //订单编号 basic.setWljyddbh(valueStr); }else if(key.equals("b_value_84")){ //抽样记录格式--类型 basic.setFcyjlgs(valueStr); } basic.setLccb_jymddl("抽查检验"); basic.setLccb_jymdxl("省抽"); basic.setLccb_djr(per.getFrymc()); return basic; }
最新发布
10-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值