Java 复制joda LocalTime的直接方法是什么?

Java 复制joda LocalTime的直接方法是什么?,java,jodatime,Java,Jodatime,我想要一个新的副本。我可以从整数中实例化,但似乎应该有更直接的方法。我也可以使用一些方法,比如copy=original.减号(零),但这也是间接的 接受Java对象参数(我使用了原始LocalTime)的LocalTime构造函数不起作用。我想它只是不支持它 LocalTime start = new LocalTime(9, 0, 0); LocalTime stop = new LocalTime(17, 0, 0); //LocalTim

我想要一个新的副本。我可以从整数中实例化,但似乎应该有更直接的方法。我也可以使用一些方法,比如
copy=original.减号(零)
,但这也是间接的

接受Java对象参数(我使用了原始LocalTime)的LocalTime构造函数不起作用。我想它只是不支持它

        LocalTime start = new LocalTime(9, 0, 0);
        LocalTime stop = new LocalTime(17, 0, 0);

        //LocalTime time = start.minusSeconds(0);  // GOOD VERSION
        LocalTime time = new LocalTime(start);     // THE BAD VERSION

        assert time == start: "does not work";

        // EXTRANEOUS STUFF TO JUSTIFY COPYING AN IMMUTABLE, FOLLOWS...
        while (time.compareTo(stop) <= 0)
        {
            //method(time, new LocalTime(9, 0, 0), stop); // MESSY
            method(time, start, stop);                    // NICER
            time = time.plusMinutes(1);
        }
LocalTime start=newlocaltime(9,0,0);
LocalTime停止=新的LocalTime(17,0,0);
//LocalTime time=start.minusSeconds(0);//好版本
LocalTime时间=新的LocalTime(开始);//坏版本
断言时间==开始:“不工作”;
//为了证明复制一个不可变项的合理性,下面是一些无关的东西。。。

while(time.compareTo(stop)LocalTime是不可变的,因此没有必要保留两个具有相同值的实例。它们可以共享(甚至跨线程)。突变方法(例如加号/减号)将返回一个新值,因此当需要修改值时,您可以“按需”创建副本

LocalTime start = new LocalTime(9, 0, 0);
LocalTime stop = new LocalTime(17, 0, 0);
LocalTime time = start;     // Just use the reference

while (time.compareTo(stop) <= 0)
{
    method(time, start, stop);
    time = time.plusMinutes(1);
}
LocalTime start=newlocaltime(9,0,0);
LocalTime停止=新的LocalTime(17,0,0);
LocalTime=start;//只需使用引用

while(time.compare)to(stop)这对我来说很好:

LocalTime t1 = new LocalTime();
try {
   // Sleep for a bit just to make sure the current system time moves on
   Thread.sleep(5000);
} catch (InterruptedException e) { }
LocalTime t2 = new LocalTime(t1);
assertEquals(t1, t2);
请注意倒数第二行-我想这就是您要查找的。
t2
t1
从纪元开始以毫秒为单位获得相同的时间


那么,当你说复制构造函数(我在上面使用了OK)“不工作”时,你的确切意思是什么呢?

我不会保留两个相同的实例,因为我将在循环中增加副本。我仍然想要原始的,因为“原始”比“新的本地时间(a,b,c)”更易于阅读更准确地说,由于对象是不可变的,因此不会有任何实际的递增,而是“递增”之前的递增对象将被垃圾回收,我仍然有一个对原始对象的引用。我仍然不理解复制的原因。只需保留原始引用。创建一个副本以便原始对象可以被GC’d不会带来任何好处,因为您分配的对象数量与允许被GC’d的对象数量相同。发布一个简化的引用可能会有用你循环的版本。我将发布我的代码以表明它不起作用。你确定你在IDE中打开了assert吗?我不知道这是为什么被否决。Eclipse默认关闭了assert,这让我非常震惊。唉,我希望否决者解释一下。我在发布代码之前运行了该代码,它起作用了,它回答了OP的问题。@broiyan-如果有帮助的话,我使用的是TestNG中的
assertEquals()
。请参阅我对您原始帖子的评论-your assert()未正确编码。断言失败的原因是
=
比较对象引用,而不是对象引用中的值。您的
开始
结束
引用指向恰好具有相同值的不同对象(它们都是
新的
'd)。您应该改用
.equals()
方法。请阅读以下内容: