使用Java GregorianCalendar类打印正确的日期

使用Java GregorianCalendar类打印正确的日期,java,Java,我试着打印一些东西,比如今天的日期,星期几,从现在起100天的日期,从现在起100天的星期几,我的生日和星期几,以及我生日后10000天和星期几。现在,我知道GregorianCalendar从1月的0开始到12月的11。我明白了,所以当我试图打印日期时,它会说今天的日期是8/25/12,而不是9/25/12,这是有道理的,但我不知道如何纠正这一点,而不将日期提前一个月,然后将月份实际放在10月而不是9月 以下是我目前正在处理的问题 GregorianCalendar cal =

我试着打印一些东西,比如今天的日期,星期几,从现在起100天的日期,从现在起100天的星期几,我的生日和星期几,以及我生日后10000天和星期几。现在,我知道GregorianCalendar从1月的0开始到12月的11。我明白了,所以当我试图打印日期时,它会说今天的日期是8/25/12,而不是9/25/12,这是有道理的,但我不知道如何纠正这一点,而不将日期提前一个月,然后将月份实际放在10月而不是9月

以下是我目前正在处理的问题

        GregorianCalendar cal = new GregorianCalendar();
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        int month = cal.get(Calendar.MONTH);
        int year = cal.get(Calendar.YEAR);
        int weekday = cal.get(Calendar.DAY_OF_WEEK);
        cal.add(Calendar.DAY_OF_MONTH, 100);
        int dayOfMonth2 = cal.get(Calendar.DAY_OF_MONTH);
        int month2 = cal.get(Calendar.MONTH);
        int year2 = cal.get(Calendar.YEAR);
        int weekday2 = cal.get(Calendar.DAY_OF_WEEK);
        GregorianCalendar birthday = new GregorianCalendar(1994, Calendar.JANUARY, 1);
        int dayOfMonth3 = birthday.get(Calendar.DAY_OF_MONTH);
        int month3 = birthday.get(Calendar.MONTH);
        int year3 = birthday.get(Calendar.YEAR);
        int weekday3 = birthday.get(Calendar.DAY_OF_WEEK);
        birthday.add(Calendar.DAY_OF_MONTH, 10000);
        int weekday4 = birthday.get(Calendar.DAY_OF_WEEK);
        int dayOfMonth4 = birthday.get(Calendar.DAY_OF_MONTH);
        int month4 = birthday.get(Calendar.MONTH);
        int year4 = birthday.get(Calendar.YEAR);
        System.out.printf("Todays date is " +month + "/" +dayOfMonth +"/" +year +".");
        System.out.printf(" It is day " +weekday +" of the week");
        System.out.println("");
        System.out.printf("In 100 days it will be " +month2 + "/" +dayOfMonth2 +"/" +year2 +". ");
        System.out.printf("Day " +weekday2 +" of the week");
        System.out.println("");
        System.out.printf("My Birthday is " +month3 + "/" +dayOfMonth3 +"/" +year3 +". "+"Day " +weekday3 +" of the week");
        System.out.println("");
        System.out.printf("10,000 days after my birthday is " +month4 + "/" +dayOfMonth4 +"/" +year4 +". " +"Day " +weekday4 +" of the week");

因此,我需要帮助更正今天的日期、100天内的日期、我生日的日期以及我生日后10000天的月份。非常感谢您的帮助和见解。

是的,您需要知道日历。一月等于零。对于日历,月份是以零为基础的

你在这里工作太辛苦了。你处理的原始数据太多了

以下是如何打印今天的日期:

DateFormat formatter = new SimpleDateFormat("yyyy-MMM-dd");
formatter.setLenient(false);
Date today = new Date();
System.out.println(formatter.format(today));  
以下是如何从现在开始100天:

Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.add(Calendar.DAY_OF_YEAR, 100);
Date oneHundredDaysFromToday = calendar.getTime();
System.out.println(formatter.format(oneHundredDaysFromToday));
停止处理所有那些
int

我明白了,所以当我试图打印日期时,它会说今天的日期是8/25/12,而不是9/25/12,这是有道理的,但我不知道如何在不将日期提前一个月的情况下纠正这一点

如果您要通过以下方式打印月份:

int month = cal.get(Calendar.MONTH);
...
 System.out.printf("Todays date is " + month + ...
然后您要打印
month+1
,而不仅仅是
month

最终,如果只将日期格式化为字符串,您将节省更多的时间和麻烦。

tl;博士 2018-01-23

2018-02-02

避免遗留日期时间类
Calendar
gregorianalendar
类令人困惑、设计拙劣且麻烦。避免使用这些类和相关的旧遗留日期时间类。现在被java.time类取代

java.time 今天的日期,

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的,因为JVM中任何应用程序的任何线程中的任何代码都可能在运行时的任何时刻更改默认值

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
或者指定一个日期。你可以用一个数字来设置月份,1-12月的数字为1-12

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性

星期几 一周中的某一天

DayOfWeek
类表示一周中从周一到周日的一天。将这些对象传递给代码,而不仅仅是整数1-7

DayOfWeek dow = ld.getDayOfWeek() ;
如果您必须有一个数字,请根据ISO 8601标准在周一至周日获得1-7

int dowNumber = ld.getDayOfWeek().getValue() ;  // Number 1-7 for Monday-Sunday.
增加天数 从现在起100天,从现在起100天,从现在起100天,我的生日和星期几,从我的生日和星期几起10000天

使用
加号…
减号…
方法进行天数的加号和减号很简单

LocalDate later = ld.plusDays( 10 ) ;  // Ten days later.
或者,使用
期间
表示年数、月数和日数

Period p = Period.ofDays( 10 ) ;
LocalDate later = ld.plus( p ) ;
100天或10000天将以同样的方式添加

LocalDate later = ld.plusDays( 10_000 ) ;
编号 现在,我知道GregorianCalendar从1月的0开始到12月的11

与遗留类不同,java.time类使用sane编号

  • 2018年的编号为2018年。不使用
    1900
    进行数学运算
  • 一月至十二月的月份编号为1-12
  • 根据标准,星期一至星期日的天数为1-7

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

谢谢,这正是我想要的。我应该想到这一点,因为它太简单了。我一直在尝试使用cal.add,这会把公司的其他部分搞得一团糟
int dowNumber = ld.getDayOfWeek().getValue() ;  // Number 1-7 for Monday-Sunday.
LocalDate later = ld.plusDays( 10 ) ;  // Ten days later.
Period p = Period.ofDays( 10 ) ;
LocalDate later = ld.plus( p ) ;
LocalDate later = ld.plusDays( 10_000 ) ;