2015-04-01 30 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對象上的修飾符不會真正修改對象,但會返回由原始對象構造的不同實例,並根據請求設置所需的字段。

所以,實際上,您正在構建很多項目,並且不會將它們分配給任何項目,因此它們會收集垃圾。最後,你打印出相同的(不可變的)項目兩次。

相關問題