11

我们的一位客户希望能够为年份部分输入只有 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;
}
4

5 回答 5

12

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
于 2008-10-30T21:25:40.493 回答
9

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 大约是最糟糕的日期格式,最终必然会导致问题。

于 2008-10-30T20:49:53.437 回答
8

这个怎么样:

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 (它有自己的解释年份字符串的规则)返回当前日期之后的日期,则让 SimpleDateFormat 解析字符串并将年份调整为上一个世纪。

这将保证所有返回的日期都是过去的。但是,它没有考虑任何可能像上个世纪之前那样被解析的日期- 例如,使用 format MM/dd/yyyy,像“01/11/12”这样的日期字符串会解析为公元 12 年 1 月 11 日

于 2008-10-30T20:09:45.123 回答
5

如果 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 版本中。

于 2008-10-30T20:49:21.953 回答
0
Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);

为我工作。

于 2014-10-30T08:00:14.593 回答