设置 LocalTime joda

Set LocalTime joda

如何从 joda 设置 LocalTime 中所需的时区?所需时区 - 莫斯科。 默认构造函数 new LocalTime() 为我显示其他时间:它显示时间,比我的时区提前一小时。

A LocalTime 没有 时区。这就是它的全部意义。

如果您想要在特定时区的特定时刻的 LocalTime,您可以使用 DateTime 然后 toLocalTime:

DateTime now = new DateTime(zone); // Urgh: see below
LocalTime localNow = now.toLocalTime();

请注意,我强烈建议使用表示时钟的依赖项来提供 "the current instant" - 然后您可以使用 "system" 实现通过 System.currentTimeMillis 等返回当前时间,但您可以使用"testing"实现返回预定义的时间,允许您在任何时间编写单元测试。

有了这样的依赖,你可能会有这样的东西:

DateTime now = new DateTime(clock.getCurrentInstant(), zone);
LocalTime localNow = now.toLocalTime();

Jon Skeets 关于可注射时钟的建议非常好。否则 - 更接近你的问题 - 你应该使用 LocalTimealternative constructor 接受 DateTimeZone 参数,以便不依赖你的系统时区,这可能不是你想要的:

LocalTime time = new LocalTime(DateTimeZone.forID("Europe/Moscow"));

它是如何工作的?

首先 Joda-Time 通过 System.currentTimeMillis() 使用标准系统时钟并获得全局时间戳。为了导出本地时间部分,Joda-Time 必须知道时区参考。这就是你在这里定义的。该区域仅用于转换,没有别的。在构建新的本地时间(没有关于时区的内部知识)之后,Joda-Time 不再需要记录的时区参考。

更新:

如果您的系统时区已经是 "Europe/Moscow"(没有参数的构造函数使用系统时区!),您应该检查您的 Joda-Time 版本。也许您有包含旧 dst 规则的过时时区数据。下载最新版本 v2.8 可能会帮助解决旧数据。