【问题标题】:jodatime DateTime millis cannot be set with actual epoch millisjodatime DateTime 毫秒不能用实际纪元毫秒设置
【发布时间】:2016-02-02 05:43:49
【问题描述】:

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

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

如果我通过更改DateTime 实例的millis 字段来更改now 的值以在return 语句上设置断点以反映与millis 不同的(有效)纪元时间,Intellij 会错误地认为该值我正在尝试设置超出int 的容量。这是有道理的,因为带有毫秒的纪元是 13 位数字,而 IIRC int 只能存储 2^32-1。

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

有哪些选择?或者,是否有更优雅的方式使用 jodatime 来推导当前的星期几,这也允许我改变值?调用者不分配返回值,而是简单地使用它进行比较。我不想放弃 jodatime,因为这个方法是一大类都使用它的方法的一部分。

提前感谢您的宝贵时间。

【问题讨论】:

  • 我不清楚您要做什么。 DateTime 是不可变类型;你不应该能够设置它。另外,当您说“millis”时,它是DateTime 中的一个字段吗?如果是这样,我就不会开始搞砸了。为什么不创建一个带有纪元毫秒和相关时区的 new DateTime?为什么你想要一个可变类型? (有 MutableDateTime,但我强烈建议避免使用它...)
  • 是的,millis 是一个字段;我更新了文本以显示这一点。我正在验证对服务器时间敏感的应用程序中的一些逻辑(例如,星期几,用户时区的时间等),我想在不等待实际的情况下练习该逻辑逻辑边界发生。例如,逻辑在周末和工作日的表现不同。在工作日,我想在调试器中改变它以“假装”它是星期六。这样做似乎需要更改 millis 字段,但由于需要毫秒的纪元时间,因此 DateTime 实例在设置时溢出
  • 我强烈建议不要使用调试器执行此操作并弄乱实现细节。相反,使用依赖注入和“时钟”抽象(一种提供“现在”概念的服务),以便您可以为您选择的任何场景编写测试。

标签: java intellij-idea jodatime


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这不是我认为的标准场景。代码肯定包含单元测试;在这种情况下,我正在与一个 QA 组织打交道,该组织“必须通过手动测试查看实时集成系统上的行为”,然后再将其推广。没有在逻辑边界手动执行代码,只是寻找提供临时解决方案的选项
  • 听起来质量保证很彻底!使用带有 long 值的 DateTime 构造函数是否适合您的场景?
猜你喜欢
  • 2020-01-11
  • 2019-02-24
  • 2012-02-19
  • 1970-01-01
  • 2015-01-10
  • 2015-07-07
  • 2013-11-11
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多