【问题标题】:What is the best way to parse a date in MM/DD/YY format and adjust it to the current / previous century?解析 MM/DD/YY 格式的日期并将其调整为当前/上个世纪的最佳方法是什么?
【发布时间】:2010-09-20 01:47:16
【问题描述】:

我们的一位客户希望能够为年份部分输入只有 2 位数字的日期。日期将是过去的日期,因此如果 2 位数年份在当前年份之后,我们希望它适用于上一个世纪,但如果 2 位数年份等于或小于当前年份,则适用于当前世纪。

截至今天 2008 年 10 月 30 日

01/01/01 = 01/01/2001

01/01/09 = 01/01/1909

这是一个奇怪的要求,我解决了这个问题,我只是不喜欢我的解决方案。 感觉有更好的方法来做到这一点。

感谢您的帮助。

public static String stupidDate(String dateString)
{
    String twoDigitYear = StringUtils.right(dateString, 2);
    String newDate = StringUtils.left(dateString, dateString.length() - 2);
    int year = NumberUtils.toInt(twoDigitYear);
    Calendar c = GregorianCalendar.getInstance();
    int centuryInt = c.get(Calendar.YEAR) - year;
    newDate = newDate + StringUtils.left(Integer.toString(centuryInt), 2) + twoDigitYear;
    return newDate;
}

【问题讨论】:

    标签: java date date-format


    【解决方案1】:

    Groovy 脚本(很容易投入到 java 中)展示了 @bobince 关于 SimpleDateFormat 的观点。

    import java.text.SimpleDateFormat
    
    SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
    SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')
    
    Calendar cal = Calendar.getInstance()
    cal.add(Calendar.YEAR, -100)
    sdf.set2DigitYearStart(cal.getTime())
    
    dates = ['01/01/01', '10/30/08','01/01/09']
    dates.each {String d ->
      println fmt.format(sdf.parse(d))
    }
    

    产量

    2001-01-01
    2008-10-30
    1909-01-01
    

    【讨论】:

      【解决方案2】:
      Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
      String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);
      

      为我工作。

      【讨论】:

      • 这个答案如何解决问题的切换世纪问题?
      【解决方案3】:

      SimpleDateFormat 已经使用两个字母“yy”格式为您解析两位数年份。 (显然,它仍然允许四位数。)

      默认情况下它使用 now-80→now+20,因此它与您建议的规则不完全相同,但它是合理且标准化的(至少在 Java 世界中),并且可以根据需要使用 set2DigitYearStart() 覆盖.

      DateFormat informat= new SimpleDateFormat("MM/dd/yy");
      DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
      return outformat.format(informat.parse(dateString));
      

      从长远来看,尝试迁移到 ISO8601 日期格式 (yyyy-MM-dd),因为 MM/dd/yy 大约是最糟糕的日期格式,最终必然会导致问题。

      【讨论】:

      • 他说他的客​​户明确要求使用特定的 2 位数年份规则。 :)
      • 是的,如果由我决定,我会说我们需要一个四位数的年份。问题解决了。
      • 确实——客户是傻瓜! :-) 这就是为什么需要偷偷摸摸地接近它!
      【解决方案4】:

      如果 Joda Time 是一个选项:

      String inputDate = "01/01/08";
      // assuming U.S. style date, since it's not clear from your original question
      DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
      DateTime dateTime = parser.parseDateTime(inputDate);
      // if after current time
      if (dateTime.isAfter(new DateTime())) {
          dateTime = dateTime.minus(Years.ONE);
      }
      
      return dateTime.toString("MM/dd/yyyy");
      

      我知道 Joda Time 不是 Java SE 的一部分,正如我在另一个线程中所说的,当有一个 Java 库可以做同样的事情时,我通常不会容忍使用第三方库。但是,开发 Joda Time 的人也在领导 JSR310 - 日期和时间 API,它将使其进入 Java 7。所以我 Joda Time 基本上将在未来的 Java 版本中出现。

      【讨论】:

      • 你应该使用 joda time Freaky Formatters 来 append2digitYear joda-time.sourceforge.net/userguide.html#Freaky_Formatters
      • 我想过做这样的事情,但这意味着当前年份将始终被视为当前年份,即使它是未来的某个时间(即,2008 年 12 月 31 日将是 2008 年 12 月 31 日而不是 1908 年 12 月 31 日)。我想正确的解决方案取决于客户的要求。
      【解决方案5】:

      这个怎么样:

      public static String anEasierStupidDateWithNoStringParsing(String dateString) {
          DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
      
          //handling ParseExceptions is an exercise left to the reader!
          Date date = df.parse(dateString);
          Calendar cal = Calendar.getInstance();
          cal.setTime(date);
      
          Calendar now = Calendar.getInstance();
          if (cal.after(now)) {
              cal.add(Calendar.YEAR, -100);
          }
      
          return cal;
      }
      

      换句话说,如果 SimpleDateFormat (which has it's own rules for interpreting year strings) 返回的日期晚于当前日期,则让 SimpleDateFormat 解析字符串并将年份调整为上个世纪。

      这将保证返回的所有日期都是过去的。但是,它不考虑上个世纪可能被解析为 before 的任何日期 - 例如,格式为 MM/dd/yyyy 的日期字符串如“01/11/12”解析为公元 12 年 1 月 11 日

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 2021-12-31
        相关资源
        最近更新 更多