Java 日期解析问题 - SimpleDateFormat 自动递减月份
Java date parsing issue - SimpleDateFormat automatically decrements month
我尝试使用以下模式从字符串中解析日期:
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 和 Month 的递减值?
@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);
日历中的月份 class 从零开始:
JANUARY = 0
FEBRUARY = 1
...
所以 9 月 = 8 (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#MONTH)。
尝试将测试更改为:
assertEquals(Calendar.SEPTEMBER, actualCalendar.get(Calendar.MONTH));
我尝试使用以下模式从字符串中解析日期:
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 和 Month 的递减值?
@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);
日历中的月份 class 从零开始:
JANUARY = 0
FEBRUARY = 1
...
所以 9 月 = 8 (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#MONTH)。
尝试将测试更改为:
assertEquals(Calendar.SEPTEMBER, actualCalendar.get(Calendar.MONTH));