tl;博士
YearMonth.now(
ZoneId.of( "America/Montreal" )
)
详情
Answer by Jon Skeet 是正确的。您正在访问常量而不是询问您自己的对象。
这是一个完全不同的替代方案,使用现代日期时间类。
避免使用旧的日期时间类
java.util.Date、java.util.Calendar 和 java.text.SimpleTextFormat 等旧的日期时间类现在是 legacy,被 java.time 类取代。
YearMonth
如果您专注于没有日期、没有时间和没有时区的年份和月份,请使用 YearMonth 类。
传递这个类的对象,而不是仅仅传递年和月的整数。这样做可以提供类型安全,确保有效值,并使您的代码更具自我记录性。
确定当前年份和月份意味着确定当前日期。为此,时区至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。
ZoneId z = ZoneId.of( "America/Montreal" );
YearMonth ym = YearMonth.now( z );
你可以询问它的部分。
int year = ym.getYear();
int month = ym.getMonthValue();
这个类提供了方便的方法,比如告诉你这是否是闰年。您可以进行数学运算,例如加/减月/年。您可以获取该年月中任何一天的日期。还有更多。
Month
我建议您使用Month 枚举,而不是仅仅使用一个月的整数。这个类有十几个预定义的实例,一年中的每个月都有一个。如上所述,使用对象可为您提供类型安全、有效值和自记录代码。
Month m = ym.getMonth();
该类具有有用的方法,例如生成带有月份名称的本地化字符串。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?