Java日期解析问题-SimpleDateFormat自动递减月份

标签 java date simpledateformat

我尝试使用模式从字符串中解析日期:

final static String DATE_RU_PATTERN = "dd.MM.yyyy"; 
private static SimpleDateFormat ruFormatter = new SimpleDateFormat(DATE_RU_PATTERN);
public static Date GetDateFromStringRuFormat (String dateString){       
    try {       
        return ruFormatter.parse(dateString);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

为什么 ruFormatter.parse(dateString) 给出的 Date 值是月份的递减值?

@Test
public void TestGetDateFromStringRuFormat(){
    final String dateString = "24.09.2015";
    Calendar actualCalendar = Calendar.getInstance();
    Date actualResult = DateFormatHelper.GetDateFromStringRuFormat(dateString);
    actualCalendar.setTime(actualResult);
    assertEquals(9, actualCalendar.get(Calendar.MONTH)); // FAILS 
    assertEquals(24, actualCalendar.get(Calendar.DAY_OF_MONTH));
    assertEquals(2015, actualCalendar.get(Calendar.YEAR));
}

最佳答案

Calendar 就像 java.util.Date 从 0 开始计算月份。 因此,每当您想对月份值做一些有意义的事情时,请为其添加 1。

来自Javadoc :

Field number for get and set indicating the month. This is a calendar-specific value. The first month of the year in the Gregorian and Julian calendars is JANUARY which is 0; the last depends on the number of months in a year.

因此您的单元测试应为:

assertEquals(9, actualCalendar.get(Calendar.MONTH) + 1);

关于Java日期解析问题-SimpleDateFormat自动递减月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771891/

相关文章:

java - 在运行时为 java 程序定义文件

html - 如何隐藏 Html <input type ="date"> 日历面板中的年份部分?

javascript - 单击下一个日期选择器时关闭日期选择器AngularJS

java - 带有前导空格而不是零的简单日期格式

Java SimpleDateFormat 和 compareTo

java - ImageButton 在类中不起作用

java - 使用 if 和 while 接受数组中的元素

java - 通过在编译时进行验证来改进构建器模式

date - 在 presto 中将 bigint 转换为时间戳

java - setLenient(false) 让通过日期格式验证