Java 从服务器日期获取时区
我正在以以下格式获取时间表单服务器: “2016-12-13T03:03:49.572-08:00”,这不是UCT格式。我需要把它转换成我当地的时区。如果我加上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
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
您的输入字符串缺少有关区域的任何信息,只包含偏移量。所以我们