Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从服务器日期获取时区_Java_Android_Date - Fatal编程技术网

Java 从服务器日期获取时区

Java 从服务器日期获取时区,java,android,date,Java,Android,Date,我正在以以下格式获取时间表单服务器: “2016-12-13T03:03:49.572-08:00”,这不是UCT格式。我需要把它转换成我当地的时区。如果我加上 getTimeZone(“America/Los_Angeles”)并进行转换,但我不想像这样硬编码,因为服务器位置可能会发生变化。有没有办法将字符串格式的日期转换为UCT,然后再转换为本地时区?或者如何将此特定情况转换为本地时间格式。(在JAVA中)您可以使用以下代码和平地解析字符串: Date d = new SimpleD

我正在以以下格式获取时间表单服务器:

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

您可以使用以下代码和平地解析字符串:

    Date d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
            .parse("2016-12-13T03:03:49.572-08:00");
然后,您可以在当前VM的时区(如果代码在“服务器”上运行,则为“服务器”的时区)中使用此代码和平打印结果日期:

在我的计算机上,结果输出是

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

当然,如果您更改了输出的格式字符串,您可以根据需要设置输出的格式。为此,请阅读SimpleDataFormat的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));

您可以使用以下代码和平地解析字符串:

    Date d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
            .parse("2016-12-13T03:03:49.572-08:00");
然后,您可以在当前VM的时区(如果代码在“服务器”上运行,则为“服务器”的时区)中使用此代码和平打印结果日期:

在我的计算机上,结果输出是

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

当然,如果您更改了输出的格式字符串,您可以根据需要设置输出的格式。为此,请阅读SimpleDataFormat的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));
tl;博士 UTC 我猜你的意思不是UCT

偏移与区域 是指小时、分钟和秒数。示例:
-08:00
比UTC晚8小时,例如在北美西海岸的大部分地区(以及其他地方)

时区是一个偏移量加上一组处理异常的规则,如夏令时(DST)。以
大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

不能从偏移量推断分区。你可以猜,但那是不明智的。如果你想知道预定的时区,你必须询问并得到明确的通知

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

OffsetDateTime
zoneDateTime
您的输入字符串缺少有关区域的任何信息,只包含偏移量。因此,我们将解析为一个

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

ZoneId zLosAngeles = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdtLosAngeles = odt.atZoneSameInstant( zLosAngeles );
你可以调整到任何区域

ZoneId zAuckland = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdtAuckland = odt.atZoneSameInstant( zAuckland );
您始终可以提取UTC的基本值,即
即时值。所有这三个
toInstant
调用都会产生与上述代码相同的值

Instant instant = odt.toInstant();
Instant instant = zdtLosAngeles.toInstant();
Instant instant = zdtAuckland.toInstant();
小贴士:

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

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 UTC 我猜你的意思不是UCT

偏移与区域 是指小时、分钟和秒数。示例:
-08:00
比UTC晚8小时,例如在北美西海岸的大部分地区(以及其他地方)

时区是一个偏移量加上一组处理异常的规则,如夏令时(DST)。以
大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

不能从偏移量推断分区。你可以猜,但那是不明智的。如果你想知道预定的时区,你必须询问并得到明确的通知

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

OffsetDateTime
zoneDateTime
您的输入字符串缺少有关区域的任何信息,只包含偏移量。所以我们