SimpleDateFormat 使用潜在危险

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代表分钟,一旦写错,则日期转换就完全错误了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值