12

我使用 JodaTime 库进行时间操作。我有两个日期: 日期一:

DateTime time_server = new DateTime(server_time_milisecs).
    withZone(DateTimeZone.forID("Europe/Zurich"));  //+0100

显示:2013-01-27 13:44:42

日期二:

DateTime time_local = new DateTime(DateTime.now()).
    withZone(DateTimeZone.getDefault());    //Have "Europe/Moscow" timezone  +0400

显示:2013-01-27 16:41:47

我需要找到包括时区在内的真实间隔

Interval interval = new Interval(time_local, time_server);
Long.toString(interval.toDurationMillis()));

结果:174040 毫秒 -不正确

int secs = Seconds.secondsBetween(time_local,time_server).getSeconds();

结果:174 秒不正确

Period period = new Period(time_local, time_server);
Integer.toString(period.getSeconds()) //**Wrong too**

结果必须是:10974 秒

4

1 回答 1

31

如果您需要进行涉及不同时区的时间计算,您应该花一些时间(不是双关语)来掌握 Jodatime 的概念(例如)。

例如,考虑以下代码

DateTime nowHere = DateTime.now();
DateTime nowZur = nowHere.withZone(DateTimeZone.forID("Europe/Zurich"));
System.out.println("now Here:   " + nowHere );
System.out.println("now Zurich: " + nowZur  );

这输出(对我来说,从苏黎世偏移 4 小时):

now Here:   2013-01-27T10:19:24.460-03:00
now Zurich: 2013-01-27T14:19:24.460+01:00

暂停并尝试猜测以下行的输出:

Interval interv = new Interval(nowHere, nowZur);
System.out.println("Interval: " + interv.toDurationMillis());

以上打印0(零)。正如它应该。

因为nowHerenowZur代表相同的时间瞬间(在物理线路时间),如在两个不同的国家所代表的那样。它们的区别仅在于它们的表示方式,但在物理上它们是相同的时间点(就像2.54 cm并且1 in是相同的长度,以两种不同的形式表示)。

同样,2013-01-27T10:19:24.460-03:00并且2013-01-27T14:19:24.460+01:00是同一时刻,即我运行该代码的时刻,仅根据不同国家/地区的惯例表示;一个火星人可以用他自己的火星历来代表同一时刻,它仍然是同一时刻

由于这些 DateTime 代表相同的时间点,因此它们之间的物理间隔(持续时间)必须为零。现在,如果你想得到两者之间的“公民时差”,那是完全不同的事情。LocalDateTime和(与和Period完全不同)将是正确的概念。例如:DateTimeDuration

Period per=new Period(nowHere.toLocalDateTime(),nowZur.toLocalDateTime());
System.out.println(per.toStandardSeconds().getSeconds());

这为我打印了 14400(4 个“标准”-不是物理-小时)

于 2013-01-27T13:34:07.920 回答