在Joda中将UTC转换为LocalDateTime?

时间:2014-09-22 14:59:30

标签: java time local jodatime

        DateTime dt = new DateTime("2014-09-15T21:20:14");
        System.out.println(dt);
        System.out.println(dt.plusMillis(581042272).toDateTime().toLocalDateTime().toDateTime(DateTimeZone.forID("GMT")));

dt中的时间是UTC,我想设置dt加上GMT的时间加上毫秒?但是,时间仍然打印为UTC(格林威治标准时间后1小时)。如何设置它以便在前面一小时?

2014-09-15T21:20:14.000+01:00
2014-09-22T14:44:16.272Z

我知道时间正好落后一小时,因为我在格林尼治标准时间15:44:16提出了这个要求

3 个答案:

答案 0 :(得分:5)

您的DateTime实际上不是在UTC中 - 它位于系统默认时区。要修复它,您只需要告诉它您传入的值是UTC:

DateTime dt = new DateTime("2014-09-15T21:20:14", DateTimeZone.UTC);
System.out.println(dt);
DateTime other = dt.plusMillis(581042272);
System.out.println(other);

输出:

2014-09-15T21:20:14.000Z
2014-09-22T14:44:16.272Z

另请注意,您无法在格林威治标准时间15:44:16提出请求,因为尚未发生。在我写这篇文章的时候,它是英国夏令时间的16:05,因此格林威治标准时间15:05。了解英国的时区不是GMT"重要的是要了解它。 - 当我们没有观察到夏令时时,这只是时区的一部分。

如果您想转换为英国时区,您需要:

DateTime other = dt.plusMillis(581042272)
    .withZone(DateTimeZone.forID("Europe/London"));

答案 1 :(得分:5)

对于那些将datetime从服务器转换为本地日期时间有困难的人:

1.确保服务器为您提供UTC时间,这意味着格式应包含时区。 2.转换模式,如果api没有给你一个时区,那么你可能因为最后一个'Z'而得到一个例外。

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        DateTime dt = formatter.parseDateTime(currentPost.postDate);

3.检查时间偏移(可选)

DateTimeZone ActualZone = dt.getZone();

4.转换到当地时间

TimeZone tz2 = TimeZone.getDefault();
        DateTime localdt = new DateTime(dt, DateTimeZone.forID(tz2.getID()));

(如果您自己控制API,并且它恰好是一个asp.net api,check this,设置日期时间的Kind,即使您可能已保存它作为数据库中的UTC时间,您将使用默认服务器时区发送日期时间

答案 2 :(得分:0)

val marketCentreTime = timeInAnotherTimezone.withZone(DateTimeZone.forID("yourCountryName/andyourCityName"));