如何在本周的第一天是上一年的情况下严格解析只有一年和一周的日期?

Sté*_*ane 10 java parsing calendar date

我的目标是进行严格的解析(例如,禁止像'98/99'这样的日期).但是,以下代码java.text.ParseException使用消息Unparseable date:"98/01"引发a :

SimpleDateFormat sdf = new SimpleDateFormat("yy/ww");
sdf.setLenient(false);
sdf.parse("98/01");
Run Code Online (Sandbox Code Playgroud)

这确实是1998年第一周,从周四开始.但是,解析一周总是返回本周第一天的日期.在那种情况下,它将是12/29/1997.这就是引发异常的原因.

看起来这个问题来自于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, 0, fields, 0, fields.length);
      throw new IllegalArgumentException(getFieldName(field));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?我认为解析1998/01应该确实会在12/29/1997返回并且不会引发任何例外.但是,您是否知道如何使解析返回01/01/1998(这将是指定年份中一周的第一天)?

Mat*_*mes 3

我认为这应该适合你(你需要图书馆的乔达时间):

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();
}
Run Code Online (Sandbox Code Playgroud)