2013-03-12 64 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