【问题标题】:Found weird behavior with Joda API发现 Joda API 的奇怪行为
【发布时间】:2014-05-21 12:01:01
【问题描述】:

我开始使用 joda API 来处理我的 Web 应用程序的时区相关问题。这样做时我发现了非常奇怪的行为。我希望必须有一些解决方法。这是我的快照代码。

DateTime utcDateTime = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
DateTime currentDateTime = DateTime.now();
int seconds = Seconds.secondsBetween(utcDateTime.toLocalDateTime(), currentDateTime.toLocalDateTime()).getSeconds();
System.out.println("hours::" + (((float)seconds)/(60*60)));

我的本​​地时区是:印度加尔各答(格林威治标准时间 + 5:30)
那么我应该得到 5.5 作为 myn 控制台输出,但我得到的是 hours::5.499722
不知道为什么?我做错什么了吗?

【问题讨论】:

  • hours,一个int,如何保存非整数值5.5?我对 joda 不是很熟悉,但看起来您可能想要获得 Minutes.minutesBetween 并使用它来代替。
  • 你是对的..看看我编辑的问题..仍然有疑问。
  • 现在你有浮点舍入错误。见floating-point-gui.de。听起来您想成对使用(小时,分钟),Jon Skeet 的回答显示了如何做。

标签: java time jodatime


【解决方案1】:
(5.5 hours - 5.499722 hours) in ms
=
1000.8 ms

1 秒,到舍入/浮点精度。你打电话

DateTime utcDateTime = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
DateTime currentDateTime = DateTime.now();

Seconds.secondsBetween().getSeconds() 为您提供整数秒数。您的调用是连续的,这意味着它们甚至可以关闭 1 毫秒,当转换为 int 时可以四舍五入到 1 秒。

【讨论】:

    【解决方案2】:

    假设您想要小时和分钟(Hours 对象只能保存整数小时数),您可能想要:

    Period period = new Period(utcDateTime.toLocalDateTime(), 
                               currentDateTime.toLocalDateTime(),
                               PeriodType.time());
    

    或者,更简洁的 IMO:

    int offsetMillis = DateTimeZone.getDefault().getOffset(Instant.now());
    Duration offset = Duration.millis(offsetMillis);
    

    根据我的经验,您应该很少需要以这种方式知道偏移量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      相关资源
      最近更新 更多