java - 如何用java生成日历?

标签 java calendar gregorian-calendar

我需要构建一个生成日历的后端 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 )

避免遗留日期时间类

避免旧的遗留日期时间类,例如DateCalendar。它们很麻烦、令人困惑、设计拙劣且存在缺陷。现在被 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 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

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类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 如何用java生成日历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43135525/

相关文章:

java - Android OpenCV 使用 MatOfKeyPoint 和 feature2d 检测

Java导入会很慢吗?

java - 在不同的包/应用程序之间保存数据

php - 在 mysql/php 中生成每周日历

java - 以字符串格式获取日期哪个经济?每次都创建日期对象或通过日历对象使用日期实例

objective-c - 当电话日历是非公历时,如何以公历格式获取今天的日期?

c# - 在日历之间转换

java - Tomcat 的 server.xml 的 JBoss 等价物是什么?

java - 在给定的字符串日期中获取该月的最后一天

java - 为什么在 UTC 中将 HOUR_OF_DAY 设置为 0 时 GregorianCalendar 会更改日期?