微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将时间戳转换为指定的时区偏移量

如何解决将时间戳转换为指定的时区偏移量

如何转换长时间戳,例如2556072000000L,到指定时区偏移量的字符串,例如+08:30?我研究了 Joda 方法,但没有找到解决方案。 同样,如何转换字符串时间戳,例如2050-12-31T04:00:00Z,到指定时区偏移量的字符串,例如+08:302050-12-31T12:30:00+08:30 在指定的偏移量中是预期的。

+08:30 解析为三部分:+、小时偏移量(8)和分钟偏移量(30),将偏移量添加timestampdateTime 可能是一个解决方案。但是,我想知道是否已经有解决方案,这样我就不需要重新发明轮子了?

/*
 * timestamp: 2556072000000L (2050-12-31T04:00:00Z)
 * offset: +08:30
 * return: 2050-12-31T12:30:00+08:30
 */
String toOffset(long timestamp,String offset);

/*
 * dateTime: 2050-12-31T04:00:00Z
 * offset: +08:30
 * return: 2050-12-31T12:30:00+08:30
 */
String toOffset(String dateTime,String offset);

解决方法

阅读此 article,我得到了问题的答案。这是:

import java.time.ZoneOffset;

/*
 * timestamp: 2556072000000L (2050-12-31T04:00:00Z)
 * offset: +08:30
 * return: 2050-12-31T12:30:00+08:30
 */
public String toOffset(long timestamp,String offset); { // +08:30
        DateTime time = new DateTime(timestamp + getOffsetMillis(offset));
        time = time.withZone(DateTimeZone.forID(DateTimeZone.UTC.getID())); // 2050-12-31T12:30:00Z
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
        String dateStr = time.toString(formatter);  // 2050-12-31T12:30:00
        return dateStr + offset; // 2050-12-31T12:30:00+08:30
}

public long getOffsetMillis(String offset) { // +08:30
    ZoneOffset zoneOffSet = ZoneOffset.of(offset);
    return zoneOffSet.getTotalSeconds() * 1000; // (8 * 60 * 60 + 30 * 60) * 1000
}

请注意时区偏移量必须在 [-18:00,+18:00] 的包含范围内。以下引自JDK document

在 2008 年,世界各地的时区偏移量从 -12:00 扩展到 +14:00。为防止扩展该范围出现任何问题,但仍提供验证,偏移范围限制为 -18:00 到 18:00(含)。

如果查看 Joda 时区 table,您会发现所有时区的偏移量都在 [-12:00,+14:00] 范围内。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。