java - Calendar.set() 无法正常工作

标签 java date calendar 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);

}

下面是我得到的输出

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

不知道错在哪里。请帮忙。

最佳答案

它不起作用,因为您在日历上操作后将日期设置为“09/31/2014”,并且 2014 年 9 月没有第 31 天。默认情况下,java Calendarlenient ,并将该日期解释为“10/01/2014”(2014 年 10 月 1 日)。

这是relevant part of the Javadoc :

When a Calendar is in lenient mode, it accepts a wider range of calendar field values than it produces. When a Calendar recomputes calendar field values for return by get(), all of the calendar fields are normalized. For example, a lenient GregorianCalendar interprets MONTH == JANUARY, DAY_OF_MONTH == 32 as February 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

更好的解决方案是将您的日历设置为该月的第一天,然后减去一天:

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

关于java - Calendar.set() 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26732874/

相关文章:

java - 如何使用java在oracle中插入自定义日期时间?

java - 在 Java 中更改当前日期而不更改服务器时钟

javascript - 有没有可以在没有任何事件的情况下显示日历的插件

java - EJB TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 不

java - 如何使用任意类型的键为通用二叉搜索树验证定义通用值范围(包括开放范围)

用于防止重复订单的 Java 同步选项(文件、数据库锁定?)

java - 从父类(super class)继承@JsonCreator注解

无法在索引 19 处解析 Java 8 日期/时间 : instant,

objective-c - 是否存在像 ipad 中那样显示周 View 的库?

android - 月份名称作为字符串