繁体   English   中英

每月的一天-Java日历

[英]Day of month - java calendar

我想要得到多少个月的时间。 我有以下代码:

    Calendar cal = Calendar.getInstance();
    cal.set(2013, 1, 1);
    System.out.println(cal.getActualMaximum(cal.DAY_OF_MONTH));

2013年的Januar(以及其他Yaers :))已经有31天了,但是,我仍然有28天,你知道我哪里出错了吗? 谢谢。

阳历和朱利安历中的第一月是一月,即0。 最后一个取决于一年中的月份数。 您将获得2月的最高天数。

试试cal.set(2013, 0, 1);

@ sunrize920已发现。 为避免出错,我发现尽可能使用Calender指定的值更容易。 因此,在您想要的情况下,将是:

cal.set(2013, Calendar.JANUARY, 1);

轻松得多,并且省去了对Calendar从0到1数月的记忆...

如果您想获得2013年1月的天数

尝试

cal.set(2013,0,1);

tl; dr

YearMonth.from(                               // Represent the month as a whole with `YearMonth` class.
    LocalDate.of( 2013 , Month.JANUARY , 1 )  // A date-only value, without time-of-day and without time zone.
)
.lengthOfMonth()                              // As for the month’s length. Returns an `int`.

31

java.time

现代方法使用java.time类来代替麻烦的旧日期时间类,例如DateCalendar

LocalDate

LocalDate类表示没有日期和时区的仅日期值。

时区对于确定日期至关重要。 在任何给定时刻,日期都会在全球范围内变化。 例如, 法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

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

continent/region的格式指定正确的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4个字母的缩写,因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果要使用JVM的当前默认时区,请提出要求并作为参数传递。 如果省略,则隐式应用JVM的当前默认值。 最好明确一点,因为缺省值可以在运行时随时由JVM中任何应用程序的任何线程中的任何代码更改。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或指定一个日期。 您可以用数字设置月份,一月至十二月的理智编号为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枚举对象,一年中的每个月使用一个。 提示:在整个代码库中使用这些Month对象,而不是仅使用整数,可以使您的代码更具自文档性,确保有效值并提供类型安全

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

YearMonth

对于该LocalDate ,获取其整个月,由YearMonth类表示。

YearMonth ym = YearMonth.from( ld ) ;

询问YearMonth对象的长度,即YearMonth的天数。

int lengthOfMonth = ym.lengthOfMonth() ;

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM