You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Unix时间戳转换为指定时区偏移的ISO 8601格式?

解决方案

方法一:使用Java 8推荐的java.time API(更安全、简洁)

Java 8引入的java.time包是线程安全的,比SimpleDateFormat更可靠,优先推荐使用。实现步骤如下:

  1. 将毫秒级Unix时间戳转换为Instant对象,它代表UTC时间线上的一个固定点。
  2. 将输入的时区偏移量(如-0700)转换为ZoneOffset对象。
  3. 把Instant转换为指定时区的OffsetDateTime。
  4. 用DateTimeFormatter格式化为符合ISO 8601标准的字符串。

修改后的代码示例:

package util.date;

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class EpochToISO {
    // 支持传入时区偏移量参数(格式如"-0700")
    public String epochToIso8601(long timeMillis, String offsetStr) {
        // 把偏移量字符串转换为ZoneOffset格式,例如"-0700"转为"-07:00"
        ZoneOffset offset = ZoneOffset.of(offsetStr.replaceAll("(\\d{2})$", ":$1"));
        // 时间戳转Instant,再适配指定时区
        OffsetDateTime offsetDateTime = Instant.ofEpochMilli(timeMillis).atOffset(offset);
        // 输出带完整时区偏移的ISO 8601格式
        DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
        return offsetDateTime.format(formatter);
    }

    public static void main(String[] args) {
        EpochToISO convert = new EpochToISO();
        long epoch = 1483772400000; // 输入1
        String offset = "-0700"; // 输入2
        String iso8601 = convert.epochToIso8601(epoch, offset);
        System.out.println(epoch + " -> " + iso8601);
        // 输出结果:1483772400000 -> 2017-01-07T00:00:00-07:00
    }
}

如果需要输出短格式时区(如-07),可以自定义格式化模式:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");
// 输出结果:2017-01-07T00:00:00-07

方法二:基于原有SimpleDateFormat修改

如果需要沿用旧版日期API,可通过转换偏移量为TimeZone对象实现需求:

  1. 将输入的偏移量(如-0700)转换为GMT开头的时区ID(如GMT-07:00)。
  2. 为SimpleDateFormat设置该自定义时区。
  3. 调整格式字符串为ISO 8601要求的T分隔符格式。

修改后的代码示例:

package util.date;

import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.text.SimpleDateFormat;

public class EpochToISO {
    // 新增时区偏移量参数
    public String epochToIso8601(long time, String offsetStr) {
        // 把偏移量转换为TimeZone可识别的GMT格式,例如"-0700"转为"GMT-07:00"
        String timeZoneId = "GMT" + offsetStr.replaceAll("(\\d{2})$", ":$1");
        TimeZone targetZone = TimeZone.getTimeZone(timeZoneId);
        
        // 格式字符串适配ISO 8601,XXX对应带冒号的时区偏移,X对应短格式偏移
        String format = "yyyy-MM-dd'T'HH:mm:ssXXX";
        SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US); // 用Locale.US避免本地化格式差异
        sdf.setTimeZone(targetZone);
        return sdf.format(new Date(time));
    }

    public static void main(String[] args) {
        EpochToISO convert = new EpochToISO();
        long epoch = 1483772400000; // 输入1
        String offset = "-0700"; // 输入2
        String iso8601 = convert.epochToIso8601(epoch, offset);
        System.out.println(epoch + " -> " + iso8601);
        // 输出结果:1483772400000 -> 2017-01-07T00:00:00-07:00
    }
}

关键细节说明

  • 偏移量格式转换:通过正则表达式replaceAll("(\\d{2})$", ":$1"),可以快速在偏移量的最后两位前添加冒号,适配API的格式要求。
  • 格式符区别:XXX对应带冒号的时区偏移(如-07:00),X对应短格式偏移(如-07);T是ISO 8601标准要求的日期与时间分隔符。
  • 本地化处理:使用Locale.US可以避免不同地区的日期格式差异,确保输出严格符合ISO 8601标准。

内容的提问来源于stack exchange,提问作者Ryan B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:10:31