Calendar.DAY_OF_WEEK 和 Calendar.DAY_OF_MONTH 有什么区别?输出每次都一样
What is the Difference Between Calendar.DAY_OF_WEEK and Calendar.DAY_OF_MONTH? The output is same every time
我正在使用 Timestamp
class 和当前时间设置时间。我用 Calendar
class 设置时间,首先是 DAY_OF_WEEK
,然后是 DAY_OF_MONTH
。我每次都得到相同的输出。那么DAY_OF_MONTH
和DAY_OF_WEEK
有什么区别呢?
Timestamp followUpDateBegins = new Timestamp(System.currentTimeMillis());
Calendar cal = Calendar.getInstance();
cal.setTime(followUpDateBegins);
cal.add(Calendar.DAY_OF_WEEK, -30);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
followUpDateBegins.setTime(cal.getTime().getTime());
System.out.println("followUpDateBegins "+followUpDateBegins);
或
Timestamp followUpDateBeginsSecond = new Timestamp(System.currentTimeMillis());
cal.setTime(followUpDateBeginsSecond);
cal.add(Calendar.DAY_OF_MONTH, -30);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
followUpDateBeginsSecond.setTime(cal.getTime().getTime());
System.out.println("followUpDateBegins" + followUpDateBeginsSecond);
DAY_OF_WEEK 是星期几(7 天),DAY_OF_MONTH 是一个月中的第几天(<=31 天)
如果你使用 add
cal.add(Calendar.DAY_OF_WEEK, -30);
等同于 cal.add(Calendar.DAY_OF_MONTH, -30);
DATE 和 DAY_OF_YEAR 的作用相同 - 因为您在这两种情况下都修改了 Days,而您只是落后了 30 天。
但是,如果您的日历设置为 4 月 15 日,并且您这样做了
cal.get(Calendar.DAY_OF_MONTH)
和 cal.get(Calendar.DAY_OF_WEEK)
他们会 return 不同的结果。
如其他答案中所述,添加两个字段会产生相同的日期,IMO,这是一个奇怪的实施细节。我们可以看到from the source code,有一个switch
语句,在添加的时候两个字段都被认为是"the same":
case DAY_OF_MONTH: // synonym of DATE
case DAY_OF_YEAR:
case DAY_OF_WEEK:
尽管它没有意义 "adding days of week"(恕我直言 - 因为最后你只需添加 天 ,无论是在同一周、同一月还是无论如何,仅此而已),这就是它的实施方式。这个API真的很迷惑...
另一个细节是 Calendar.getInstance()
已经 returns 当前 date/time - it internally calls System.currentTimeMillis()
, 所以创建一个 Timestamp
只是在日历中设置它是多余的。你可以这样做:
// create the calendar
Calendar cal = Calendar.getInstance();
// do your stuff
...
// create the timestamp
Timestamp followUpDateBeginsSecond = new Timestamp(cal.getTimeInMillis());
我正在使用 Timestamp
class 和当前时间设置时间。我用 Calendar
class 设置时间,首先是 DAY_OF_WEEK
,然后是 DAY_OF_MONTH
。我每次都得到相同的输出。那么DAY_OF_MONTH
和DAY_OF_WEEK
有什么区别呢?
Timestamp followUpDateBegins = new Timestamp(System.currentTimeMillis());
Calendar cal = Calendar.getInstance();
cal.setTime(followUpDateBegins);
cal.add(Calendar.DAY_OF_WEEK, -30);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
followUpDateBegins.setTime(cal.getTime().getTime());
System.out.println("followUpDateBegins "+followUpDateBegins);
或
Timestamp followUpDateBeginsSecond = new Timestamp(System.currentTimeMillis());
cal.setTime(followUpDateBeginsSecond);
cal.add(Calendar.DAY_OF_MONTH, -30);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
followUpDateBeginsSecond.setTime(cal.getTime().getTime());
System.out.println("followUpDateBegins" + followUpDateBeginsSecond);
DAY_OF_WEEK 是星期几(7 天),DAY_OF_MONTH 是一个月中的第几天(<=31 天)
如果你使用 add
cal.add(Calendar.DAY_OF_WEEK, -30);
等同于 cal.add(Calendar.DAY_OF_MONTH, -30);
DATE 和 DAY_OF_YEAR 的作用相同 - 因为您在这两种情况下都修改了 Days,而您只是落后了 30 天。
但是,如果您的日历设置为 4 月 15 日,并且您这样做了
cal.get(Calendar.DAY_OF_MONTH)
和 cal.get(Calendar.DAY_OF_WEEK)
他们会 return 不同的结果。
如其他答案中所述,添加两个字段会产生相同的日期,IMO,这是一个奇怪的实施细节。我们可以看到from the source code,有一个switch
语句,在添加的时候两个字段都被认为是"the same":
case DAY_OF_MONTH: // synonym of DATE
case DAY_OF_YEAR:
case DAY_OF_WEEK:
尽管它没有意义 "adding days of week"(恕我直言 - 因为最后你只需添加 天 ,无论是在同一周、同一月还是无论如何,仅此而已),这就是它的实施方式。这个API真的很迷惑...
另一个细节是 Calendar.getInstance()
已经 returns 当前 date/time - it internally calls System.currentTimeMillis()
, 所以创建一个 Timestamp
只是在日历中设置它是多余的。你可以这样做:
// create the calendar
Calendar cal = Calendar.getInstance();
// do your stuff
...
// create the timestamp
Timestamp followUpDateBeginsSecond = new Timestamp(cal.getTimeInMillis());