首页 > 解决方案 > 将时间戳转换为指定的时区偏移量

问题描述

如何将长时间戳(例如)转换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);

标签: timezoneoffset

解决方案


阅读这篇文章,我得到了我的问题的答案。这里是:

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文档

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

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


推荐阅读