从服务器日期获取时区

时间:2016-12-13 16:26:17

标签: java android date

我按以下格式获取时间表格服务器:

“2016-12-13T03:03:49.572-08:00”,这不是UCT格式。我需要将其转换为我当地的时区。如果我加 TimeZone.getTimeZone(“America / Los_Angeles”)明确地进行转换而不是它发生的好但我不想像这样硬编码,因为服务器位置可能会改变。有没有办法将字符串格式的日期转换为UCT,然后转换为本地时区?或如何转换为此特定情况的本地时间格式。 (在JAVA中)

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码来解析字符串:

    Date d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
            .parse("2016-12-13T03:03:49.572-08:00");

然后,您可以在当前VM的时区(如果代码在“服务器”上运行)的“服务器”的时区中使用这段代码打印生成的日期:

    System.out.println(
            new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
                .format(d));

在我的计算机上,生成的输出

2016-12-13T12:03:49.572+01:00
因为我住在德国。

当然,如果您为此更改格式字符串,则可以根据需要执行输出格式。为此,请阅读SimpleDateFormat的类javadoc。 例如。你可以用

    System.out.println(
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
                .format(d));

获得更易读的输出。

如果您的代码不在服务器上运行,那么您必须知道时区。然后你可以写例如。

 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    format.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
    System.out.println(format.format(d));

答案 1 :(得分:1)

TL;博士

OffsetDateTime.parse( "2016-12-13T03:03:49.572-08:00" )
              .toZoneSameInstant( ZoneId.of( "Pacific/Auckland" ) )

UTC

我猜你的意思是UTC而不是UCT。

抵消与区域

offset-from-UTC是一个小时数&分钟&秒。示例:-08:00比UTC晚8小时,例如在北美(以及其他地方)西海岸的大部分地区都可以看到。

时区是偏移量加上用于处理夏令时(DST)等异常的一组规则。以continent/region格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

您无法从偏移中推断出区域。你可以猜测,但那是不明智的。如果您想知道预期的时区,您必须明确询问并获得通知。

这就是为什么ZonedDateTime::toString方法明智地扩展了YYYY-MM-DDTHH:MM:SS.S…Z的标准ISO 8601格式,以便在方括号中附加区域的名称。例如,2016-12-13T03:03:49.572-08:00[America/Los_Angeles]

OffsetDateTime& ZonedDateTime

您的输入字符串缺少有关区域的任何信息,只是偏移。所以我们解析为OffsetDateTime

OffsetDateTime odt = OffsetDateTime.parse( "2016-12-13T03:03:49.572-08:00" );

如果您想在任何特定区域的挂钟时间内看到,请调整。

ZoneId zLosAngeles = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdtLosAngeles = odt.atZoneSameInstant( zLosAngeles );

您可以调整到任何区域。

ZoneId zAuckland = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdtAuckland = odt.atZoneSameInstant( zAuckland );

您始终可以使用Instant提取UTC的基本值。根据上述代码,所有这三个toInstant调用都会产生相同的值。

Instant instant = odt.toInstant();
Instant instant = zdtLosAngeles.toInstant();
Instant instant = zdtAuckland.toInstant();

提示:

  • 通常最适合在UTC工作。以UTC格式存储和交换数据,并以UTC格式思考。将UTC视为“唯一真实时间”,所有偏移和区域仅为variations on the theme
  • 将日期时间值序列化为文本时,请使用标准ISO 8601格式。这就是他们的目的,它们设计得很好:跨文化的明确,直观,易于解析。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore