cod*_*Man 3 java calendar date gregorian-calendar
我想得到上个月的结束日期,我得到当前月份并将其重新计算并设置该月份值.但是Calender.set(Calender.Month,lastMonth)仅适用于特定日期.
public static String getLastMonthEndDate(Date nowDate, String dateFormat)
{
final String METHOD_NAME = "getLastMonthEndDate" ;
SimpleDateFormat formatedDate = new SimpleDateFormat(dateFormat);
Calendar calendar = new GregorianCalendar(2014, Calendar.OCTOBER, 31); // Hard coded as 2014, oct 31st for the sake of example.
//calendar.setTime(nowDate);
System.out.println(calendar.getTime());
if(calendar.get(Calendar.MONTH) == Calendar.JANUARY)
{
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1);
}
//System.out.println("calendar.get(Calendar.MONTH) -1 : " + (calendar.get(Calendar.MONTH) -1));
int lastMonth = (calendar.get(Calendar.MONTH) -1);
System.out.println("Last month : "+lastMonth);
calendar.set(Calendar.MONTH, lastMonth);
//System.out.println(calendar.getTime());
//System.out.println("(calendar.get(Calendar.MONTH) : " + calendar.get(Calendar.MONTH));
System.out.println("calendar.getActualMaximum(Calendar.DAY_OF_MONTH) : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println("calendar.getTime() : " + calendar.getTime());
return formatedDate.format(calendar.getTime());
}
public static void main(String[] args)
{
Date dCurrentDate = getCurrentDate();
String strLastMonthEndDateInYYYY = getLastMonthEndDate(dCurrentDate, "MM/dd/yyyy");
System.out.println("strLastMonthEndDateInYYYY : "+strLastMonthEndDateInYYYY);
}
Run Code Online (Sandbox Code Playgroud)
以下是我得到的输出
output :
Fri Oct 31 00:00:00 IST 2014
Last month : 8
calendar.getActualMaximum(Calendar.DAY_OF_MONTH) : 31
calendar.getTime() : Wed Oct 01 00:00:00 IST 2014
strLastMonthEndDateInYYYY : 10/01/2014
Run Code Online (Sandbox Code Playgroud)
我不知道错误在哪里.请帮忙.
它不起作用,因为您在日历上操作后将日期设置为"09/31/2014",并且2014年9月没有第31天.默认情况下,java Calendar是宽松的,并将该日期解释为"10"/01/2014"(2014年10月1日).
当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值.当日历重新计算get()返回的日历字段值时,所有日历字段都会进行规范化.例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日.
这里是代码相关部分的注释版本,用于解释正在发生的事情:
Calendar calendar = new GregorianCalendar(2014, Calendar.OCTOBER, 31); // 10/31/2014
// [...]
int lastMonth = (calendar.get(Calendar.MONTH) -1); // lastMonth will be Calendar.SEPTEMBER
calendar.set(Calendar.MONTH, lastMonth); // internal value of the calendar is now 09/31/2014
// [..]
System.out.println("calendar.getActualMaximum(Calendar.DAY_OF_MONTH) : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // returns 31 because this is a get() method, so 09/31/2014 will be converted to 10/01/2014, and there are 31 days in October (but the internal representation of the calendar will still be 09/31/2014)
// [...]
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // internal representation is still 09/31/2014, so this will not change the value
// [...]
return formatedDate.format(calendar.getTime()); // this is a get() method, so the value will be converted to 10/01/2014
Run Code Online (Sandbox Code Playgroud)
更好的解决方案是将您设置Calendar为该月的第一天,并减去一天:
Calendar calendar = new GregorianCalendar(2014, 9, 31);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
System.out.println((new SimpleDateFormat("MM/dd/yyyy")).format(calendar.getTime())); // 09/30/2014
Run Code Online (Sandbox Code Playgroud)