我需要构建一个生成日历的后端 Java 类。日历有 12 个月来完成一年。那一年的正月是七月,最后一个月是六月。从某种意义上说,生成的日历中的月份将具有不同的年份。例如,第一个月为 2016 年 7 月,最后一个月为 2017 年 6 月,依此类推。以下是我到目前为止所拥有的。
public class Calendars {
public Date startDate;
public Date endDate;
public String periodName;//This is the name of the year(e.g July-2016 to June-2017 may be called period01)
public short physicalYear;//This is the normal year
public Calendars() {
}
public Calendars(Date startDate, Date endDate, String periodName, short physicalYear) {
this.startDate = startDate;
this.endDate = endDate;
this.periodName = periodName;
this.physicalYear = physicalYear;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String getPeriodName() {
return periodName;
}
public void setPeriodName(String periodName) {
this.periodName = periodName;
}
public short getPhysicalYear() {
return physicalYear;
}
public void setPhysicalYear(short physicalYear) {
this.physicalYear = physicalYear;
}
@Override
public String toString() {
return "Calendars{" +
"startDate=" + startDate +
", endDate=" + endDate +
", periodName='" + periodName + '\'' +
", physicalYear=" + physicalYear +
'}';
}
}
最佳答案
tl;博士
YearMonth.of( 2017 , Month.JULY )
.plusYears( 1 )
避免遗留日期时间类
避免旧的遗留日期时间类,例如Date
和Calendar
。它们很麻烦、令人困惑、设计拙劣且存在缺陷。现在被 java.time 类取代。
年月
您似乎想要跟踪整月的时间跨度。为此,请使用 YearMonth
类。
请注意,与遗留类不同,在 java.time 中,月份具有合理的编号,1-12 表示一月至十二月。
YearMonth start = YearMonth.of( 2017 , 7 );
YearMonth stop = start.plusYears( 1 );
或者使用方便的 Month
指定月份枚举。
YearMonth start = YearMonth.of( 2017 , Month.JULY );
如果您需要当前的YearMonth
,请指定时区。请记住,对于任何特定时刻,全局各地的日期因地区而异,因此月份也可能会有所不同。
指定proper time zone name格式为大洲/地区
,如America/Montreal
, Africa/Casablanca
,或太平洋/奥克兰
。切勿使用 3-4 个字母的缩写,例如 EST
或 IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。
ZoneId z = ZoneId.of( "America/Montreal" );
YearMonth ym = YearMonth.now( z );
本地日期
要处理单个日期,请使用 LocalDate
类。
LocalDate firstOfMonth = ym.atDay( 1 );
LocalDate dayAfter = firstOfMonth.plusDays( 1 );
LocalDate endOfMonth = ym.atEndOfMonth();
<小时/>
关于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类?
- Java SE 8和 SE 9然后
- 内置。
- 是标准 Java API 的一部分,具有捆绑实现。
- Java 9 添加了一些小功能和修复。
- Java SE 6和 SE 7
- 许多 java.time 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- Android
- ThreeTenABP项目专门针对 Android 改编了 ThreeTen-Backport(如上所述)。
- 参见How to use ThreeTenABP… .
ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
,和more .
关于java - 如何用java生成日历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43135525/