我正在尝试制作一个对象的深层副本,包括GregorianCalendar
个实例。我总是担心使用clone()
并且它似乎没有被覆盖,所以我只是按字段进行复制。理想情况下,有一个复制构造函数,我可以这样使用:
GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar);
不幸的是我在API中找不到任何这样的功能,并且试图弄清楚我需要哪些字段来获得精确的副本。那么,要复制其中一个日历,你会怎么做?我在这里错过了一些简单的快捷方式吗?
答案 0 :(得分:37)
java.util.Calendar
已覆盖clone()
正在运行,因此请使用它。此外,Calendar
没有深层数据层次结构 - 其数据主要是int
s。
要扩展答案,如果整个数据层次结构实现SerializationUtils.clone(..)
Serializable
(来自commons-lang)
答案 1 :(得分:1)
具体来说,复制日历的最快代码行是:
GregorianCalendar newCalendar = (Calendar)(oldCalendar.clone());
答案 2 :(得分:0)
使用取代了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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:-7)
呃,clone()
很糟糕。
难道难吗?您只需设置3件事,我相信,时间,时区和区域设置。所有这些领域都有吸气剂和二传手。制作一个非常实用的方法来返回副本?