以MM / DD / YY格式解析日期并将其调整到当前/上个世纪的最佳方法是什么?

我们的一位客户希望能够输入年份组件只有2位数的日期。 该日期将在过去,因此如果2位数年份在当前年份之后,我们希望它在上个世纪有效,但如果2位数年份等于或小于当前年份,则工作在本世纪。

截至今天10/30/2008

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; } 

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 

这个怎么样:

 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解析String并将年份调整为上个世纪。

这样可以保证返回的所有日期都是过去的。 但是,它没有说明在上个世纪之前可能被解析的任何日期 – 例如,格式为MM/dd/yyyy ,日期字符串如“01/11/12”解析为公元12年1月11日

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

如果Joda Time是一个选项:

 String inputDate = "01/01/08"; // assuming US 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的一部分,正如我在另一个post中所说的那样,当有一个Java库做同样的事情时,我通常不会宽恕使用第三方库。 然而,正在开发Joda Time的人也领导JSR310–日期和时间API,它将进入Java 7.所以我Joda Time基本上将在未来的Java版本中。

 Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString); String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate); 

为我工作

乔达时代的枢纽年

优秀的Joda-Time 2.5库包含此function。 无需自己编写任何代码。 只需在DateTimeFormatter上调用withPivotYear() 。 有关如何使用它的示例,请参阅该链接文档。

最好的方法是在Java中使用Joda Time API来表示日期和时间。