2015-11-04 43 views
2

我有一个像“1512”这样的字符串。我需要将它转换为日期2015-12-31 23:59:59。20年后的解析日期

在这种情况下,我正在使用Java Dateformat解析。

我的代码:

private static final dateformat = new SimpleDateFormat("yyMM"); 

public static boolean checkDate(String date){ 
Date date = dateformat.parse(date); 
} 

它能给日高达20年。当日期是“3610”时,它是1936年,而不是2036年(当前世纪)。

+0

所以你想能够解析未来的日期?此外,只是好奇,为什么你选择指定月份的最后一秒? – Arc676

+0

你可以使用Java 8吗? – assylias

+0

[当然,没有一个人在他们的正确思想中仍然认为编写能够处理年份为两位数字的软件是一个好主意?](https://en.wikipedia.org/wiki/Year_2000_problem)您不能承担额外的两个字节? –

回答

2

我想,你可以手动解析字符串,然后创建Date对象。

假设:

public static void checkDate(String date) throws ParseException { 
    Calendar calendar = Calendar.getInstance(); 
    int year = Integer.parseInt(date.substring(0, 2)); 
    int month = Integer.parseInt(date.substring(2, 4)); 
    calendar.setLenient(false);   
    int yearOfCentury = calendar.get(Calendar.YEAR); 
    int century = yearOfCentury - yearOfCentury % 100; 
    year = year + century; 
    calendar.set(Calendar.YEAR, year); 
    calendar.set(Calendar.MONTH, month-1); 
    calendar.set(Calendar.DATE,    calendar.getActualMaximum(Calendar.DATE)); 
    calendar.set(Calendar.HOUR_OF_DAY, 23); 
    calendar.set(Calendar.MINUTE, 59); 
    calendar.set(Calendar.SECOND, 59); 
    System.out.println("Date +" + calendar.getTime());  
} 
1

如果您是确保今年应该是始终2000+然后用“20”手动前缀字符串和使用的SimpleDateFormat作为

private static final dateformat = new SimpleDateFormat("yyyyMM"); 

docs

对于解析缩写年份模式(“y”或“yy”),SimpleDateFormat必须解释相对于某个 世纪的缩写年份。它通过将日期调整为在创建SimpleDateFormat实例之前的 和20年之前的80年内完成。 例如,使用在1997年1月1日创建的“MM/dd/yy”模式和SimpleDateFormat实例,字符串“01/11/12”将被解释为2012年1月11日的 ,而字符串“ 05/04/64“将被解释为5月4日 ,。

0

YearMonth解析器的Java 8两位数年的默认行为是从2000年开始所以这会给你的结果,你希望:

YearMonth ym = YearMonth.parse("3610", DateTimeFormatter.ofPattern("yyMM")); 
//ym = 2036-10 

如果您想在特定日期截止(例如,您希望80-99为1980-1999,0-79为2000-2079),则可以使用a custom pattern

+0

我们无法使用Java 8。 –