将 Android 中的 Joda 时间转换为本地时区

Ult*_*o_m 2 java timezone datetime android jodatime

我想在 android 中使用 Joda 时间库将时间转换为手机本地时区。

例如,我有 UTC 时间: 2016-01-14 11:13:56

我现在的时间是: 2016-01-14 12:13:56

当我运行此代码时:

DateTime dt = new DateTime(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(usersResponse.lastUpdate),
                DateTimeZone.UTC);

String time = String.valueOf(dt));
Run Code Online (Sandbox Code Playgroud)

我得到: 2016-01-14T10:13:56.000Z

当我运行此代码时:

DateTime dt = DateTime.parse(usersResponse.lastUpdate, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));

String time = String.valueOf(dt));
Run Code Online (Sandbox Code Playgroud)

我得到: 2016-01-14T11:13:56.000+01:00

当我运行此代码时:

DateTime dt = new DateTime(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(usersResponse.lastUpdate),
                DateTimeZone.forID("Europe/Rome"));

String time = String.valueOf(dt));
Run Code Online (Sandbox Code Playgroud)

我得到: 2016-01-14T11:13:56.000+01:00

但这是错误的,我应该收到: 2016-01-14T12:13:56.000+02:00

有没有我遗漏的配置。这个问题是否与夏令时有关(从这里的一些问题来看,我已经看到 Joda Time 管理了这个问题)

我怎样才能获得设备本地时间的时间。

谢谢

Lau*_*nce 5

DateTime 对象表示自 Unix 纪元以来的特定毫秒。这是您试图表示的时刻的规范表示。

如果您在罗马、伦敦或纽约,根据您称之为毫秒的内容打印出该 DateTime 对象,就像特定毫秒的字符串别名。

当你这样做时:

String time = String.valueOf(dt));
Run Code Online (Sandbox Code Playgroud)

你只是说“给我一个支持 DateTime 对象的毫秒的字符串表示,你没有指定你想要那个毫秒的 TimeZone 别名,所以它在 UTC 中给你。

这个:

    DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(usersResponse.lastUpdate)
Run Code Online (Sandbox Code Playgroud)

没有指定您希望格式化程序使用哪个时区,因此它将假定为 UTC。之后创建 DateTime 对象的所有用法都无关紧要,毫秒已设置。

而是这样做:

DateTimeFormatter inputFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZone(Time_you_are_coming_from);
DateTimeFormatter outputFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZone(time_your_are_converting_to);
dt = inputFormatter.parseDateTime("2016-01-14 11:13:56");
System.out.println(outputFormatter.print(dt));
Run Code Online (Sandbox Code Playgroud)