克隆公历日历的最快方法?tl;博士ZonedDateTime关于 java.time

2022-09-01 15:52:51

我正在尝试创建对象的深度副本,包括一个实例。我总是对使用持谨慎态度,而且它似乎没有在这里被覆盖,所以我只是在逐个字段地复制。理想情况下,会有一个复制构造函数,我可以这样使用它:GregorianCalendarclone()

GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar);

不幸的是,我在API中找不到任何此类功能,并且试图弄清楚我需要哪些字段才能获得确切的副本。那么,要复制这些日历之一,你会怎么做呢?我在这里错过了一些简单的快捷方式吗?


答案 1

java.util.Calendar已经覆盖了哪个正在工作,所以使用它。此外,它没有很深的数据层次结构 - 它的数据主要是s。clone()Calendarint

为了扩展答案,如果整个数据层次结构实现,则可以在任何创建深度副本的对象上调用(从Apache commons-lang调用)。SerializationUtils.clone(…)Serializable


答案 2

tl;博士

使用取代 的现代 java.time 类。GregorianCalendar

GregorianCalendar.from(                     // Convert from modern object to legacy class object.
    myGregorianCalendar.toZonedDateTime()   // Convert from legacy to modern.
)                                           // Returns a new `GregorianCalendar` object.

但最好完全停止使用,只使用.GregorianCalendarZonedDateTime

ZonedDateTime

这个可怕的类在几年前被JSR 310中定义的java.time类所取代。专门替换为 ZonedDateTime 类。GregorianCalendar

您可以使用添加到旧类的新/方法来回转换。to…from…

ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;

朝另一个方向走。

GregorianCalendar myGregorianCalendar = GregorianCalendar.from( zdt ) ;

要具体解决您的问题,请结合这两个转换以获取另一个对象。GregorianCalendar

GregorianCalendar gc = GregorianCalendar.from( myGregorianCalendar.toZonedDateTime() ) ;

关于 java.time

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

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

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

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

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter