我在Java中学习Calendar类,我无法理解Set(Calendar.Day OF MONTH)
方法。
这就是:
import java.util.Calendar;
import java.util.Date
public class TestCalender
{
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
Date date= cal.getTime();
System.out.println(date);
cal.set(Calendar.DAY_OF_MONTH,33);
//cal.set(Calendar.MONTH,13);------>(1)
Date newdate = cal.getTime();
System.out.println(newdate);
输出:
Fri May 12 17:30:50 CDT 2017
Fri Jun 02 17:30:50 CDT 2017
当我取消注释语句(1)时,输出变为:
Fri May 12 17:33:22 CDT 2017
Mon Mar 05 17:33:22 CST 2018
这是我的问题:
我理解月份到3月的变化,但我无法弄清楚日期变为5的原因。根据我的理解,日期不应改为2018年4月2日(当时33岁)计算3月份的天数,因为3月只有31天计算到4月份。)
如果有人能帮助解决这个疑问,我将非常感激。
提前致谢。
此致 Roopa
答案 0 :(得分:3)
Calendar
类使用从0开始的月份,并在12月结束时使用11。因此,当您将月份设置为13时,您指定了下一年的2月,而“2月33日”(有28天)则是3月5日。
java.util.date类很古怪且难以使用。改为使用java.time。
答案 1 :(得分:2)
我正在学习日历课程
<强>不强>
Calendar
类是出了名的麻烦,设计糟糕,容易混淆和有缺陷。现在遗产。由java.time类补充。我们可以把这个类扫成Java历史的垃圾箱。
在其众多问题中,Calendar
使用1月至12月的疯狂月份编号0-11。这个事实在正确的Answer by Kyriacou中正确描述。相比之下,java.time类在1月至12月期间使用合理的编号1-12;请参阅Month
枚举。
不完全确定您在该代码段中的目标是什么,但您似乎要将33天添加到某个日期。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
java.time和遗留类之间的一个重要区别是现代类使用immutable objects。因此,将日期添加到日期会生成 new 日期对象,其值基于原始对象,而原始对象保持不变。这避免了很多混乱,并使它们成为thread-safe。
LocalDate ld = LocalDate.of( 2017 , Month.MARCH , 23 ) ;
LocalDate later = ld.plusDays( 33 );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。