我们的一位客户希望能够输入年份组件只有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; }
Ken Gentle.. 10
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
bobince.. 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大约是最糟糕的日期格式,并且最终会导致问题.
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
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大约是最糟糕的日期格式,并且最终会导致问题.
这个怎么样:
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日
如果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版本中.