我有两个时间戳,以毫秒为单位,这些时间戳是在不同的时区创建的,无法转换为相同的时区。
ngOnInit() {
this.getArea();
}
getArea(): void {
this.metadataService.getMeta()
.subscribe(meta => {
this.area= meta;
});
}
是否有任何机构知道如何识别时区并以UTC + 0获取值?
当我转换这些时间戳时,总是得到这些时间戳有时区+0的值。
答案 0 :(得分:3)
如果您在Java中创建的毫秒时间戳,总是毫秒
1970年1月1日午夜UTC
对时区一无所知。
你看到了什么:
Mon May 07 2018 11:53:55
Mon May 07 2018 09:53:55
只显示当前JVM /计算机时区中那些时刻的字符串表示
如果您需要在UTC时区中使用字符串表示,那么有许多类可以执行此操作。在所有JDK中都有Calendar实现(例如GregorianCalendar
)。从Java 8开始,新的API受到Joda时间的启发。
使用时区处理它应该更好。
答案 1 :(得分:2)
如果您获得时区+ 0,那是因为这是任何金额的固定时间(在您的示例中为毫秒)给出的默认时区。如果你想要一个UTC + 0的其他时区,你必须告诉它你所在的时区。
答案 2 :(得分:1)
是否有人知道如何......以UTC + 0获取值?
我先从容易的部分开始:
OffsetDateTime dateTime = Instant.ofEpochMilli(1_525_694_035_615L)
.atOffset(ZoneOffset.UTC);
System.out.println(dateTime);
打印:
2018-05-07T11:53:55.615Z
这与你在问题中所说的一致。最后的Z
表示UTC。
......如何识别时区...
我们不能确切地说。如果您知道时间戳在生成它的时区中所对应的时间,我们就可以计算出偏移量。因为当答案是UTC时,这是相当无聊的,我采取了一个不同的例子:
long timestamp = 1_525_708_128_067L;
LocalDateTime dateTimeInUnknownTimezone = LocalDateTime.of(2018, Month.MAY, 7, 18, 48, 48);
LocalDateTime utcDateTime = Instant.ofEpochMilli(timestamp)
.atOffset(ZoneOffset.UTC)
.toLocalDateTime()
.truncatedTo(ChronoUnit.SECONDS);
int offsetInSeconds = (int) ChronoUnit.SECONDS.between(utcDateTime, dateTimeInUnknownTimezone);
ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetInSeconds);
System.out.println(offset);
03:00
由于日期时间仅具有秒的精度,因此我还将UTC时间截断为秒,以使偏移精确。但是,从+03:00的偏移量,我们无法明确地确定时区,因为许多时区都使用此偏移量。