从ISO String格式化Joda DateTime的时区问题

时间:2016-06-16 17:57:43

标签: android jodatime isodate

所以时间格式化和调整一直是我编程中最大的克星,我在Android / Java中遇到了一些我无法弄清楚的问题。我从UTC格式化的服务器获取时间戳(这是一个示例 2016-06-17T18:30:00-07:00 。现在这次需要格式化为用户本地时间(因此,对于PST中的用户,它应显示为上午11:30),但到目前为止,无论我尝试什么,我要么得到凌晨1点或下午6:30(所以我知道我做错了什么我只是不知道是什么)。这就是我的意思一直试图做

public static DateTime convertISOStringToDate(String inputString) {
//setup the ISO Date Formatter with GMT/UTC format
    DateTimeFormatter formatter = ISODateTimeFormat.dateTimeParser()
            .withLocale(Locale.US)
            .withZone(DateTimeZone.forOffsetHours(0));
    DateTime dateTime = formatter.parseDateTime(inputString);
    //now convert the datetime object to a local date time object
    DateTimeFormatter localFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
            .withZone(DateTimeZone.getDefault());
    String localString = localFormatter.print(dateTime);
    DateTime localDateTime = localFormatter.parseDateTime(localString);
    return localDateTime;

所以此时我已经凌晨1:30了,所以我知道我在转换过程的某个地方搞砸了但是我无法弄明白。我一直在尝试谷歌,但到目前为止还没有找到太多使用ISODateTimeFormat解析器,所以当我尝试它们时它们不起作用。

1 个答案:

答案 0 :(得分:0)

您似乎对如何表示日期有基本的误解。 日期(几乎每种已知的编程语言/库)在内部表示为与特定“原始时间”的偏移,称为“Epoch”。

在java.util.Date以及joda日期中,内部表示是自1980年1月1日午夜以来的毫秒数。

因此,日期没有时区。您只在格式化日期时引入时区(将其转换为日期的字符串表示形式)。

你犯了一个常见的错误,就是把一个String解析成一个日期对象,用一个与原始字符串不同的时区序列化(打印)它,然后再次解析回一个日期,期待一些事情发生了变化。如果你这样做的话,你会得到与你开始时完全相同的日期。

在您的情况下,您获得的“localString”会在本地时区显示正确的时间。我在美国东部时间,也就是UTC-4:00,我正确地得到2016-06-17 21:30:00。

正如我所说,将其解析回DateTime,然后查看它是没用的,因为:

  • 您将获得与

  • 相同的DateTime
  • 您的IDE(或您用来检查DateTime的任何内容)可能没有显示您的期望。

你应该重新评估你在这里做了什么,以及你是否真的需要“转换”DateTime,或者只是解析它,并且真正理解日期格式化对时区的影响。