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

时间:2016-01-14 11:43:38

标签: java android datetime timezone jodatime

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

我有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));

我得到: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));

我得到: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));

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

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

我缺少任何配置吗?这个问题是否与夏令时有关(从某些问题来看,我已经看到Joda Time管理了这个问题)

如何设法在设备当地时间获取时间。

由于

1 个答案:

答案 0 :(得分:3)

DateTime对象表示自unix时期以来的特定毫秒。这是您尝试表示的时刻的规范表示。

如果您在罗马或伦敦或纽约,根据您所称的那个毫秒来打印该DateTime对象,就像特定毫秒的字符串别名一样。

当你这样做时:

String time = String.valueOf(dt));

你只是说"给我一个返回DateTime对象的milleseconds的字符串表示,你没有指定你想要的那个毫秒的别名,所以它以UTC格式给你。

此:

    DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(usersResponse.lastUpdate)

未指定格式化程序要使用的时区,因此它将采用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));