在Java中创建Calendar对象的临时副本

时间:2013-05-21 20:34:35

标签: java calendar

我需要弄清楚如何创建一个临时日历对象(已存在的“永久”日历的副本),以便我可以操作副本:tempCal.add(unit,value)。我需要保持原始日历对象不变,所以我真的不想直接调用add(unit,value)。

由于我创建副本的尝试都没有实际起作用,我当前的丑陋黑客是调用permanentCal.add(unit,value),显示所需的结果,然后调用permanentCal.add(unit,-value) - 看来,不冷静。

5 个答案:

答案 0 :(得分:14)

java.util.Calendarclone方法,您可以使用它。其中的所有数据都是由基元组成的,因此您不会遇到麻烦。

看看这些答案:

答案 1 :(得分:1)

(不适用于Android)

切换到java 8的不可变LocalDateTime,即Calendar / Date的后续版本。这个API是一个巨大的改进,起初可能有点压倒性。

minusDays(long)这样的方法会返回新的日期。这使得线程安全性和所有。例如,能够共享一个值而不用担心有人改变它。

答案 2 :(得分:1)

如果您要使用时间,日,月,周,年等进行计算,则可以使用timeInMillis进行复制,如下所示:

Calendar calendarCopy = Calendar.getInstance()
calendarCopy.setTimeInMillis(calendarOriginal.getTimeInMillis)
doSomethingWith(calendarCopy)

通过这种方式,您可以在副本中包含时间,日,月,周,年等。

答案 3 :(得分:1)

java.time.ZonedDateTime

Calendar类非常糟糕,其通常的具体类GregorianCalendar也是如此。这些旧类在几年前被现代的 java.time 类(特别是ZonedDateTime)所取代。

遇到Calendar对象时,请查看它是否确实是GregorianCalendar对象。如果是这样,请使用添加到旧类中的新to… / from…方法进行转换。

if( myCal instanceof GregorianCalendar ) {
    GregorianCalendar gc = ( GregorianCalendar ) myCal ;  // Cast to the concrete type.
    ZonedDateTime zdt = gc.toZonedDateTime() ;  // Convert from legacy class to modern class.
}

不可变的对象

java.time 类明智地使用immutable objects模式,以适合其用途。

因此,您不要在现有对象内操作单个成员字段。取而代之的是,您传递一个新的字段值,以基于原始值和特定的不同值的组合来产生一个新的对象。请参阅with方法。

添加/减去时间跨度

在您的情况下,您似乎想执行加法或减法以到达新的时刻。

使用以下命令指定时间跨度:

  • Duration的小时-分钟-秒的比例
  • Period,范围为年-月-日。

示例:添加几天以便稍后。

Period p = Period.ofDays( 3 ) ;  
ZonedDateTime threeDaysLater = zdt.plus( p ) ;

要进行这种工作,您可能会发现方便的由下面链接的 ThreeTen-Extra 库提供的IntervalLocalDateRange类。


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

enter image description here

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

答案 4 :(得分:0)

约达时间

如果您想以酷炫的方式执行此操作,请使用Joda-Time库。

这个非常成功的第三方开源日期时间框架为现在构建到Java 8及更高版本中的java.time框架提供了灵感。