0

所以时间格式化和调整一直是我在编程中最大的克星,我在 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 解析器的东西,所以当我尝试它们时它们也不起作用。

4

1 回答 1

0

您似乎对日期的表示方式有基本的误解。日期(在几乎所有已知的编程语言/库中)在内部表示为与特定“起始时间”(称为“纪元”)的偏移量。

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

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

您犯了将字符串解析为日期对象的常见错误,使用与指示的原始字符串不同的时区将其序列化(打印)回来,然后再次解析回日期,期望发生某些变化。如果您正确执行此操作,您将获得与开始时完全相同的日期。

在您的情况下,您获得的“localString”显示了当地时区的正确时间。我在 EDT,即 UTC-4:00,结果我正确地得到了 2016-06-17 21:30:00。

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

  • 您将获得与开始时相同的 DateTime

  • 您的 IDE(或您用来检查 DateTime 的任何东西)可能没有显示您所期望的。

您应该重新评估您在这里所做的事情,以及您是否真的需要“转换” DateTime,或者只是解析它,并真正了解日期格式如何与时区相关。

于 2016-06-16T18:28:32.393 回答