如何用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
相关产品推荐
相关产品推荐

