Java中UTC时间戳转指定时区并提取各类时间字段的实现方法
Java 8+ 实现方案(基于java.time官方时间库,无需第三方依赖)
前置说明
你输入的时间串后缀 --UTC是冗余内容,第一步需要先清洗掉该后缀,得到标准的ISO 8601带偏移时间格式。
完整代码示例
import java.time.*; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; public class TimeParseDemo { public static void main(String[] args) { // 1. 从JSON拿到的原始时间串 String rawTimeStr = "2021-02-11T09:00:00-07:00 --UTC"; // 2. 清洗冗余后缀,得到标准ISO格式串 String standardTimeStr = rawTimeStr.replace(" --UTC", ""); // 3. 解析为ZonedDateTime对象 ZonedDateTime originalZdt = ZonedDateTime.parse(standardTimeStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME); // 4. 转换为指定时区,示例为上海时区,可替换为你需要的时区ID,比如"America/New_York" ZoneId targetZone = ZoneId.of("Asia/Shanghai"); ZonedDateTime targetZdt = originalZdt.withZoneSameInstant(targetZone); // 5. 提取字段存入Map Map<String, Object> timeInfoMap = new HashMap<>(); timeInfoMap.put("week", targetZdt.getDayOfWeek().toString()); // 星期,需中文可自行做枚举映射 timeInfoMap.put("dayOfYear", targetZdt.getDayOfYear()); // 日期序号(当年第几天) timeInfoMap.put("dayOfMonth", targetZdt.getDayOfMonth()); // 日期(当月第几天) timeInfoMap.put("month", targetZdt.getMonthValue()); // 月份数字,要英文全称用getMonth().toString() timeInfoMap.put("year", targetZdt.getYear()); // 年份 timeInfoMap.put("time", targetZdt.toLocalTime().toString()); // 时间,可通过DateTimeFormatter自定义格式 timeInfoMap.put("zone", targetZdt.getZone().toString()); // 时区信息 // 输出测试 System.out.println(timeInfoMap); } }
输出示例(以上海时区为例)
{week=THURSDAY, dayOfYear=42, dayOfMonth=11, month=2, year=2021, time=23:00, zone=Asia/Shanghai}
注意事项
- 时区请使用标准的区域ID格式(如
Asia/Shanghai),不要用三位缩写(如CST),避免歧义 - 如果需要自定义时间/星期的输出格式,可以用
DateTimeFormatter.ofPattern()自行指定格式模板 - 该方案不需要引入任何第三方依赖,java.time包从Java 8开始内置,是官方推荐的时间处理方案
其他语言实现思路
- Python:用
datetime模块的fromisoformat方法解析清洗后的时间串,用Python 3.9+内置的zoneinfo或者第三方pytz库做时区转换,提取对应字段后存入字典即可 - JavaScript:用
dayjs配合时区插件,或者原生Intl.DateTimeFormat处理,解析后提取字段存入对象即可
内容的提问来源于stack exchange,提问作者Nikita Dixit
相关产品推荐
相关产品推荐

