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

如何用Java/Kotlin将PST毫秒时间戳转换为UTC毫秒时间戳

将PST基准的毫秒数转换为UTC基准毫秒数

核心思路

你的输入毫秒数是以1970年1月1日00:00 PST为起始点的计时值,而非标准的UTC epoch(1970年1月1日00:00 UTC)。转换的关键是先将这个PST基准的毫秒数映射到太平洋时区的具体时间,再转换为UTC时区的标准epoch毫秒数。

Java 实现(Java 8+ 时间API)

import java.time.ZoneId;
import java.time.ZonedDateTime;

public class PstToUtcMillisConverter {
    public static void main(String[] args) {
        // 输入的PST基准毫秒数
        long pstBasedMillis = 1674064800000L;
        
        // 定义太平洋时区(自动处理PST/PDT夏令时切换)
        ZoneId pacificZone = ZoneId.of("America/Los_Angeles");
        
        // 构造PST的起始基准时间:1970-01-01 00:00 PST
        ZonedDateTime pstEpochStart = ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, pacificZone);
        
        // 计算输入毫秒对应的太平洋时区时间
        ZonedDateTime targetPstTime = pstEpochStart.plusMillis(pstBasedMillis);
        
        // 转换为UTC时区的标准epoch毫秒数
        long utcBasedMillis = targetPstTime.toInstant().toEpochMilli();
        
        // 输出结果:1674093600000
        System.out.println(utcBasedMillis);
    }
}

Kotlin 实现

Kotlin可直接复用Java 8+时间API,写法更简洁:

import java.time.ZoneId
import java.time.ZonedDateTime

fun main() {
    val pstBasedMillis = 1674064800000L
    val pacificZone = ZoneId.of("America/Los_Angeles")
    val pstEpochStart = ZonedDateTime.of(1970, 1, 1, 0, 0, 0, 0, pacificZone)
    val targetPstTime = pstEpochStart.plusMillis(pstBasedMillis)
    val utcBasedMillis = targetPstTime.toInstant().toEpochMilli()
    
    // 输出结果:1674093600000
    println(utcBasedMillis)
}

简化计算方式(已知固定时差时)

如果确认所有输入都基于PST(无需处理夏令时切换),可直接用固定时差计算:
PST比UTC晚8小时,对应时差为 8 * 3600 * 1000 = 28800000 毫秒,因此:

// Java
long utcBasedMillis = pstBasedMillis + 28800000L;
// Kotlin
val utcBasedMillis = pstBasedMillis + 28800000L

这种方式性能更高,但仅适用于无夏令时的场景,优先推荐时区API方案以兼容所有太平洋时区时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:50:21