jodatime DateTime millis不能用实际的epoch millis设置

时间:2016-02-01 18:05:44

标签: java intellij-idea jodatime

我正在寻找一种合理的方法来设定jodatime的DateTime millis的值。在Intellij IDEA(v15)中进行调试时,我正在查看以下代码:

public String getDayOfWeek(String timezone) {
  DateTime now = DateTime.now(DateTimeZone.forID(timezone));
  return now.dayOfWeek().getAsText();
}

如果我通过更改now实例的millis字段来突变返回语句,以便改变DateTime的值,以反映与millis不同的(有效)纪元时间,Intellij错误,我试图设置的值超过int的容量。这是有道理的,因为具有millis的纪元是13位且IIRC int只能存储2 ^ 32-1。

DateTime实例中没有可见字段,没有毫秒的纪元时间。我可以用没有毫秒的10位纪元时间成功设置值,但显然不能正确评估;我只提到它说我能够成功地在调试器中设置范围内值。

有哪些选择?或者,有一个更优雅的方式与jodatime导出一周的当前日期,也允许我改变价值?调用者不会分配返回值,而只是将其用于比较。我不想废弃jodatime,因为这个方法是所有使用它的一大类方法的一部分。

提前感谢您的时间。

1 个答案:

答案 0 :(得分:0)

也许您遇到过这个问题,因为使用的值被解释为int而不是long?您可以使用带DateTime参数的long构造函数之一来指定日期和时间(以毫秒为单位)。例如:

import org.joda.time.*;
import org.joda.time.format.*;

public class JodaTimeMillis {
    public static void main(final String[] arguments) {
        new JodaTimeMillis().run();
    }

    private void run() {
        DateTimeZone timeZone = DateTimeZone.forID("Europe/Amsterdam");
        String pattern = "MM/dd/yyyy HH:mm:ss.SSS";
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(pattern);

        for (int milliseconds = 619; milliseconds < 629; milliseconds++) {
            DateTime dateTime = new DateTime(1234567890000L + milliseconds, timeZone);
            System.out.println(milliseconds + ": " + dateTimeFormatter.print(dateTime));
        }
    }
}

这给出了以下输出(在我的笔记本电脑上),它显示了可以指定的毫秒部分:

619: 02/14/2009 00:31:30.619
620: 02/14/2009 00:31:30.620
621: 02/14/2009 00:31:30.621
622: 02/14/2009 00:31:30.622
623: 02/14/2009 00:31:30.623
624: 02/14/2009 00:31:30.624
625: 02/14/2009 00:31:30.625
626: 02/14/2009 00:31:30.626
627: 02/14/2009 00:31:30.627
628: 02/14/2009 00:31:30.628

您想从调试器运行测试吗?您还可以考虑使用unit tests