在日历中设置值(java.util.Calendar)

时间:2017-05-12 22:50:21

标签: java java-calendar

我在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

2 个答案:

答案 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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore