我使用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毫秒 - NOT CORRECT
int secs = Seconds.secondsBetween(time_local,time_server).getSeconds();
结果:174秒 NOT CORRECT
Period period = new Period(time_local, time_server);
Integer.toString(period.getSeconds()) //**Wrong too**
结果必须为:10974秒
答案 0 :(得分:25)
如果您需要进行涉及不同时区的时间计算,您应该花一些时间(没有双关语)来掌握Jodatime概念(eg)。
例如,请考虑以下代码
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
(零)。应该如此。
由于nowHere
和nowZur
代表相同的时刻(在物理行时间内),因为在两个不同的国家/地区代表。它们的区别仅在于它们的表示方式,但在物理上它们是相同的时间点(如2.54 cm
和1 in
长度相同,以两种不同的形式表示)。
同样,2013-01-27T10:19:24.460-03:00
和2013-01-27T14:19:24.460+01:00
是同一时刻,我运行该代码的时刻,仅根据不同国家/地区的惯例来表示;火星人可以用他自己的火星日历表示同一个瞬间,它仍然是同一时刻。
由于这些DateTime表示相同的时间点,因此它们之间的物理间隔(持续时间)必须为零。现在,如果你想获得两者之间的“民间时差”,那就完全不同了。 LocalDateTime
和Period
(完全不同于DateTime
和Duration
)将成为正确的概念。例如:
Period per=new Period(nowHere.toLocalDateTime(),nowZur.toLocalDateTime());
System.out.println(per.toStandardSeconds().getSeconds());
这为我打印14400(4“标准” - 不是物理 - 小时)