2015-04-01 86 views
20

我想设置Joda-Time中的小时,分​​钟和秒钟。但是当我设定它不改变财产。如何使用Joda-Time设置Java中的Time属性

这里是我的代码:

import org.joda.time.DateTime; 
public class JodaAkbar 
{ 
public static void main(String args[]) 
{ 
    DateTime dt = new DateTime(); 
    System.out.println("Before:"+dt); 
    dt.hourOfDay().setCopy(5); 
    dt.minuteOfDay().setCopy(20); 
    dt.secondOfDay().setCopy(0); 
    System.out.println("After:"+dt); 
} 
} 

这里是输出。

Before:2015-04-01T11:01:38.277+11:00 
After:2015-04-01T11:01:38.277+11:00 

我得到相同的输出。这里发生了什么问题?

编辑:

基本上,我想所示下面的代码做同样的事情。由于下面的代码在24小时制格式下无法正常工作,我转而使用Joda-Time。

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.HOUR, 13); 
cal.set(Calendar.MINUTE, 25); 
cal.set(Calendar.SECOND, 0); 
+0

AKAIK'DateTime'是不可变的,它不能被自己改变,但'setCopy'将返回一个带有更新值的'DateTime'的新实例。 'DateTime after = dt.houtOfDay()。setCopy(5)'... – MadProgrammer 2015-04-01 00:13:43

回答

46

Joda-Time对象是不可变的。 setCopy中的“复制”一词告诉您,它不直接设置这些字段,而是创建DateTime的副本并修改该字段。

一个快速的解决方法是:

dt = dt.hourOfDay().setCopy(5); 
dt = dt.minuteOfHour().setCopy(20); 
dt = dt.secondOfMinute().setCopy(0); 

更流畅的方法是链几个with方法一起使用:

DateTime dt = new DateTime() 
    .withHourOfDay(5) 
    .withMinuteOfHour(20) 
    .withSecondOfMinute(0); 

还是做这一切与一个withTime电话:

DateTime dt = new DateTime().withTime(5, 20, 0, 0); 

顺便说一句,Java 8引入了一个新的java.time套装受到Joda-Time的启发。 Joda-Time网站建议:“从Java SE 8开始,用户需要迁移到java.time(JSR-310)。”

+2

@MenoHochschild谢谢,我不知道。我已经重写了该段落。 – 2015-04-01 14:21:52

3

查看不可变数据结构。 JodaTime对象上的修饰符不会真正修改对象,但会返回由原始对象构造的不同实例,并根据请求设置所需的字段。

所以,实际上,您正在构建很多项目,并且不会将它们分配给任何项目,因此它们会收集垃圾。最后,你打印出相同的(不可变的)项目两次。