克隆GregorianCalendar的最快方法?

时间:2010-03-23 10:36:02

标签: java calendar copy clone

我正在尝试制作一个对象的深层副本,包括GregorianCalendar个实例。我总是担心使用clone()并且它似乎没有被覆盖,所以我只是按字段进行复制。理想情况下,有一个复制构造函数,我可以这样使用:

GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar);

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

4 个答案:

答案 0 :(得分:37)

java.util.Calendar已覆盖clone()正在运行,因此请使用它。此外,Calendar没有深层数据层次结构 - 其数据主要是int s。

要扩展答案,如果整个数据层次结构实现SerializationUtils.clone(..)

,您可以在任何进行深层复制的对象上调用Serializable(来自commons-lang

答案 1 :(得分:1)

具体来说,复制日历的最快代码行是:

GregorianCalendar newCalendar = (Calendar)(oldCalendar.clone());

答案 2 :(得分:0)

tl; dr

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

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

但是最好完全停止使用GregorianCalendar,而仅使用ZonedDateTime

ZonedDateTime

可怕的GregorianCalendar类早在几年前就被JSR 310中定义的 java.time 类所取代。特别是被ZonedDateTime类所取代。

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

ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;

往另一个方向。

GregorianCalendar myGregorianCalendar = GregorianCalendar.from( zdt ) ;

要专门解决您的问题,请将这两种转换结合在一起,以获得另一个GregorianCalendar对象。

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

关于 java.time

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

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

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

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

答案 3 :(得分:-7)

呃,clone()很糟糕。

难道难吗?您只需设置3件事,我相信,时间,时区和区域设置。所有这些领域都有吸气剂和二传手。制作一个非常实用的方法来返回副本?