我的目标是严格解析(例如禁止像98/99这样的日期).但是,以下代码引发了一个
java.text.ParseException,其中包含消息Unparseable date:“98/01”:
SimpleDateFormat sdf = new SimpleDateFormat("yy/ww"); sdf.setLenient(false); sdf.parse("98/01");
这的确是first week of 1998,从星期四开始.然而,一周的解析总是返回本周第一天的日期.在这种情况下,将是1997年12月29日.这就是为什么会出现异常的原因.
看来这个问题来自于GregorianCalendar类,更具体地说来自于computeTime()方法,该方法检查当解析不宽松时,原始字段是否与外部设置的字段匹配:
if (!isLenient()) { for (int field = 0; field < FIELD_COUNT; field++) { if (!isExternallySet(field)) { continue; } if (originalFields[field] != internalGet(field)) { // Restore the original field values System.arraycopy(originalFields,fields,fields.length); throw new IllegalArgumentException(getFieldName(field)); } } }
这是一个bug吗?我认为1998/01年度的解析确实会回到1997年12月29日,并没有引起任何例外.但是,您是否知道如何使解析返回01/01/1998(这将是指定年份的一周的第一天)?
解决方法
我认为这应该适合你(你需要这个图书馆的时候):
public static Date parseYearWeek(String yearWeek) { DateTime dateTime = DateTimeFormat.forPattern("yy/ww").parseDateTime(yearWeek); if (dateTime.getWeekOfWeekyear() == 1 && dateTime.getMonthOfYear() == 12) { dateTime = DateTimeFormat.forPattern("yyyy/mm").parseDateTime((dateTime.getYear() + 1) + "/01"); } return dateTime.toDate(); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。