2013-03-12 83 views
2

我的代碼的輸出是0,0,0。我期待0,-1,1代替。代碼中有什麼問題?爲什麼我不能從DateTime中添加或減去秒數?如何在Joda Time中正確比較DateTime或MutableDateTime對象?

public static void main(String[]args){ 

    DateTime dt1 = new DateTime();  
    DateTime dt2 = new DateTime(dt1); // dt2 = dt1 
    DateTime dt3 = new DateTime(dt1); // dt3 < dt1 
    DateTime dt4 = new DateTime(dt1); // dt4 > dt1 

    dt3.minusSeconds(10); 
    dt4.plusSeconds(10); 

    int result1 = dt1.compareTo(dt2); 
    int result2 = dt1.compareTo(dt3); 
    int result3 = dt1.compareTo(dt4); 

    System.out.println("Results " + result1 + " , " + result2 + " , " + result3); 

} 
+0

嘗試使用MutableDateTime執行相同的代碼。 API說DateTime是不可變的。 API - DateTime是線程安全且不可變的,前提是年代學也是如此。所有提供的標準Chronology類都是線程安全和不可變的。也閱讀 - http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#minusDays%28int%29 – 2013-03-12 08:17:46

+0

隨着MutableDateTime你想使用添加,而不是加號。 – 2013-03-12 08:18:31

+0

@JonSkeet - 是的。但是,我在MutableDateTime中看不到類似minusSeconds()的方法。這是爲什麼?我現在該怎麼做呢? – 2013-03-12 08:22:49

回答

6

minusSeconds()返回DateTime對象的副本。

你可以試試這個:

public static void main(String[]args){ 

    DateTime dt1 = new DateTime();  
    DateTime dt2 = new DateTime(dt1); // dt2 = dt1 
    DateTime dt3 = new DateTime(dt1).minusSeconds(10); // dt3 < dt1 
    DateTime dt4 = new DateTime(dt1).plusSeconds(10); // dt4 > dt1 

    int result1 = dt1.compareTo(dt2); 
    int result2 = dt1.compareTo(dt3); 
    int result3 = dt1.compareTo(dt4); 

    System.out.println("Results " + result1 + " , " + result2 + " , " + result3); 

} 
+0

yes got fortega – 2013-03-12 08:18:07

1

minusSecondsplusSeconds返回DateTime的副本。

您需要重新分配您的變量:

dt3 = dt3.minusSeconds(10); 
dt4 = dt4.plusSeconds(10); 
1

DateTime不變。當您執行dt3.minusSeconds(10);時,dt3所指的DateTime對象未被修改;相反,它會返回一個新的DateTime對象。將您的代碼更改爲:

dt3 = dt3.minusSeconds(10); 
dt4 = dt4.plusSeconds(10); 
0

在我的問題中編輯代碼以考慮年代而不是秒(請參閱下文)。這很容易讓我們看到,如果我們得到 - 我們添加年份的時間( - 一些大的int)。我們得到一個數學上沒有問題的負值,但在現實生活中並未使用。

public static void main(String[]args){ 

    DateTime dt1 = new DateTime();  
    DateTime dt2 = new DateTime(dt1); // dt2 = dt1 
    DateTime dt3 = new DateTime(dt1); // dt3 < dt1 
    DateTime dt4 = new DateTime(dt1); // dt4 > dt1 
    MutableDateTime mdt1 = new MutableDateTime(dt1); // mdt1 = dt1 
    mdt1.addYears(-10); 

    dt3 = dt3.minusYears(10); 
    dt4 = dt4.plusYears(10); 

    int result1 = dt1.compareTo(dt2); 
    int result2 = dt1.compareTo(dt3); 
    int result3 = dt1.compareTo(dt4); 

    System.out.println("Results " + result1 + " , " + result2 + " , " + result3); 
    System.out.println("IMmutable is " + dt1); 
    System.out.println("mutable is " + mdt1); 

    mdt1.addYears(-10000); 
    System.out.println("mutable is " + mdt1); 


} 
+1

這完全不清楚爲什麼你將這個添加爲*答案*,並且你還沒有指定任何輸出。至於在現實生活中是否使用負值 - 他們絕對是。 1萬年前是公元前8000年左右......你在這裏有什麼意思? – 2013-03-12 09:12:54

+0

對不起。產出如問題所預期的那樣。我的錯。我很少在現實生活中遇到負面時期(例如10小時前),並認爲他們不會被需要。 – 2013-03-12 09:38:32

+2

不,他們很常見。例如,「我預計這個身份驗證令牌最多可以在10分鐘前生成」或「我希望用戶至少年滿18歲,即出生日期少於」現在 - 18年「 – 2013-03-12 09:41:45

相關問題