加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 当本周的第一天是在上一年时,如何严格分析一个只有一年

发布时间:2020-12-14 16:48:18 所属栏目:Java 来源:网络整理
导读:我的目标是严格解析(例如禁止像98/99这样的日期).但是,以下代码引发了一个 java.text.ParseException,其中包含消息Unparseable date:“98/01”: SimpleDateFormat sdf = new SimpleDateFormat("yy/ww");sdf.setLenient(false);sdf.parse("98/01"); 这的确
我的目标是严格解析(例如禁止像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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读