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提出了这个要求
答案 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"));