我按以下格式获取时间表格服务器:
“2016-12-13T03:03:49.572-08:00”,这不是UCT格式。我需要将其转换为我当地的时区。如果我加 TimeZone.getTimeZone(“America / Los_Angeles”)明确地进行转换而不是它发生的好但我不想像这样硬编码,因为服务器位置可能会改变。有没有办法将字符串格式的日期转换为UCT,然后转换为本地时区?或如何转换为此特定情况的本地时间格式。 (在JAVA中)
答案 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)
OffsetDateTime.parse( "2016-12-13T03:03:49.572-08:00" )
.toZoneSameInstant( ZoneId.of( "Pacific/Auckland" ) )
我猜你的意思是UTC而不是UCT。
offset-from-UTC是一个小时数&分钟&秒。示例:-08:00
比UTC晚8小时,例如在北美(以及其他地方)西海岸的大部分地区都可以看到。
时区是偏移量加上用于处理夏令时(DST)等异常的一组规则。以continent/region
格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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();
提示:
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。