是否可以根据两个时间戳确定 UTC 偏移量?

问题描述 投票:0回答:2

假设我有两个时间戳。一个采用 UTC,另一个时区未知,但有日期和时间。后者的格式为

YYYY:MM:DD HH:MM:SS
.

通过简单地从 UTC 时间戳中减去第二个时间戳,然后对小时进行四舍五入来获取与 UTC 的偏移量是否合理?

有没有一种简单的方法可以使用 Java 来做到这一点? (例如 Joda 或 JUT?)

谢谢!

一点背景知识:这些日期来自图像的 EXIF 元数据。 EXIF 以以下格式存储图像的

CreateDate
YYYY:MM:DD HH:MM:SS
,不带时区信息。它还在
GPSTimeStamp
下存储 UTC 时间戳(有时)。使用这两个值,我希望导出偏移量以便用它存储创建日期。尽管有 TZ 偏移量的 EXIF 元数据,但相机很少记录它。

java datetime timestamp utc datetimeoffset
2个回答
2
投票

免责声明:我可能还没有理解你的两个“时间戳”的确切格式或数据类型。对于此预订,这里有一个建议。

    String dateTimeStringUtc = "2017-08-25T11:46:47.307";
    // for the sake of the example I took North Korean time; don’t tell anyone just yet :-)
    String dateTimeStringUnknownOffset = "2017-08-25T20:16:47.307";
    
    LocalDateTime utcTime = LocalDateTime.parse(dateTimeStringUtc);
    LocalDateTime unknownOffsetTime = LocalDateTime.parse(dateTimeStringUnknownOffset);
    long offsetSeconds = ChronoUnit.SECONDS.between(utcTime, unknownOffsetTime);
    if (Math.abs(offsetSeconds) > 64800) { // out of range
        System.out.println("The time strings cannot represent the same time");
    } else {
        ZoneOffset offset = ZoneOffset.ofTotalSeconds((int) offsetSeconds);
        System.out.println("The zone offset is " + offset);
    }

打印:

The zone offset is +08:30

正如评论中所讨论的,四舍五入到整个小时通常是一个糟糕的主意。现在四舍五入到一刻钟可能比较安全,但我犹豫了,谁知道明年是否会有地方引入8点20分的偏移量?历史上已经存在以秒为单位的区域偏移,因此如果您的时间戳表示“过去的美好时光”,您可能应该避免任何舍入。


1
投票

这就是我最终所做的:

public static ZoneOffset determineTimeZoneOffset(OffsetDateTime localTime, OffsetDateTime utcTime) {
  if(utcTime == null || localTime == null) {
    return null;
  }

  OffsetDateTime ceilingUtc = utcTime.truncatedTo(ChronoUnit.HOURS).plusHours(1);
  OffsetDateTime ceilingLocal = localTime.truncatedTo(ChronoUnit.HOURS).plusHours(1);

  int offsetHours = (int)ChronoUnit.HOURS.between(ceilingUtc, ceilingLocal);

  return ZoneOffset.ofHours(offsetHours);
}
  • 有关截断为小时的警告很好理解,但出于应用程序的目的,这是因为我们不需要走那么远。然而,我想使用

    ChronoUnit.MINUTES
    甚至秒来截断是很容易的。 Ole V.V. 进行了一项有趣的练习。很有帮助的指出。

  • 不知道为什么这会被否决——也许是对时间戳含义的混淆。我认为从这个问题中可以很清楚地看出我指的是通用时间戳(正如 Ole V.V. 和其他人指出的那样)。我希望投反对票的人重新阅读问题并调整他们的评估。

  • 虽然我并不认为它与问题相关,但这些日期来自图像的 EXIF 元数据。 EXIF 以以下格式存储图像的

    CreateDate
    YYYY:MM:DD HH:MM:SS
    ,不带时区信息。它还在
    GPSTimeStamp
    下存储 UTC 时间戳(有时)。使用这两个值,我希望导出偏移量以便用它存储创建日期。尽管有 TZ 偏移的 EXIF 元数据,但相机很少记录它。

© www.soinside.com 2019 - 2024. All rights reserved.