【问题标题】:Detect invalid date on Calendar.set()检测 Calendar.set() 上的无效日期
【发布时间】:2015-10-21 12:57:57
【问题描述】:

我有这个方法返回一个 Date(),它被其中一个“字段”(DAY、MONTH、YEAR)更改。

public static Date getDateChanged(Date date, int field, int value) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(field, value);
    return cal.getTime();
}

但是,当我们尝试设置的字段与相关日期不兼容时,cal.set() 无法给出异常。所以,在这种情况下:

Date date = new Date();
date = getDateChanged(date, Calendar.DAY_OF_MONTH, 29); 
date = getDateChanged(date, Calendar.MONTH, 1); // feb

日期最终是 01/03/15,因为 Calendar.set() 检测到 2 月不能设置为第 29 天,所以自动将日期设置为下一个可能的日期(我认为这就是日常工作)。

这还不错,但是,就我而言,

我想检测到我尝试构建的日期是不可能的,然后开始减少这一天,所以在这种情况下,我想要实现的是 28/02/15,我该怎么做?

例子:

29/02/15 ===> 28/02/15

【问题讨论】:

    标签: java date


    【解决方案1】:

    您可以使用cal.getActualMaximum(Calendar.DAY_OF_MONTH) 查找日历实例在给定月份中的最大天数。

    这样你就可以自己处理上面提到的情况了。

    也可以在这里查看答案:Number of days in particular month of particular year?

    【讨论】:

      【解决方案2】:

      你可以使用:

      public void setLenient(boolean lenient)
      

      指定日期/时间解释是否宽松。 在宽大的解释下,诸如“1996 年 2 月 942 日”之类的日期将 被视为相当于 2 月 1 日之后的第 941 天, 1996. 在严格(非宽松)解释下,这样的日期将导致抛出异常。默认是宽松的。

      Parameters:
          lenient - true if the lenient mode is to be turned on; false if it is to be turned off.
      See Also:
          isLenient(), DateFormat.setLenient(boolean)
      

      这样当你传递错误时你会得到异常:)

      【讨论】:

      • 我认为他不想例外
      • 他说:'我想检测我尝试构建的日期是不可能的,然后开始递减日期'。抛出异常是确定某事不可能的一种方法。他也可以抓住它并在此基础上做其他事情。
      • 如果不能例外,现在日期(此处为 29/2/15)被添加为 (01/03/15) 到下一个日期,但在这里他希望添加 28/2/15。 @polska 如果我错了请纠正我
      • 好吧,如果他将标志设置为 false,则会出现异常。然后他可以将数字减一,然后再试一次,或者做一些其他事情,最终会在正确的日期结束。
      【解决方案3】:

      你可以用getActualMaximum查看最大值:

      public static Date getDateChanged(Date date, int field, int value) {
          Calendar cal = Calendar.getInstance();
          cal.setTime(date);
          int maximum = calendar.getActualMaximum(field);
          if (value > maximum) {
              value = maximum;
          }
          cal.set(field, value);
          return cal.getTime();
      }
      

      【讨论】:

        【解决方案4】:

        也许这个解决方案会对你有所帮助

        public static Date getDateChanged(Date date, int field, int value) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.set(field, value);
            if (field == Calendar.MONTH && cal.get(Calendar.MONTH) != value) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(date);
                int month = (cal.get(Calendar.MONTH) - 1) < 0 ? 0 : (cal.get(Calendar.MONTH) - 1);
                calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DATE));
                calendar.set(Calendar.MONTH, month);
                calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
                return calendar.getTime();
            }
            return cal.getTime();
        }
        

        【讨论】:

          猜你喜欢
          • 2010-11-24
          • 1970-01-01
          • 2015-11-29
          • 2019-02-11
          • 1970-01-01
          相关资源
          最近更新 更多