Java中如何将指定格式的时间字符串转换为Unix时间戳?
Java中将"Feb 11 2023 9:35:41 PM"转换为Unix时间戳的方法
推荐方案(Java 8+,使用java.time新API)
Java 8及以上版本优先使用java.time包的API,线程安全且功能更完善,步骤如下:
- 定义匹配格式的DateTimeFormatter:注意时间字符串中日期部分是两个空格(
Feb 11 2023),模式字符串需对应写两个空格;用h表示12小时制,a匹配AM/PM标记。若系统默认语言非英文,需指定英文Locale避免解析失败。 - 解析字符串为LocalDateTime:通过
LocalDateTime.parse完成解析。 - 转换为Unix时间戳:将
LocalDateTime关联时区后转成Instant,再通过getEpochSecond()(秒级)或toEpochMilli()(毫秒级)获取时间戳。
示例代码:
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Locale; public class TimeConverter { public static void main(String[] args) { String timeStr = "Feb 11 2023 9:35:41 PM"; // 指定英文Locale,避免非英文环境下解析月份缩写失败 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy h:mm:ss a", Locale.ENGLISH); LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter); // 转换为系统默认时区的时间戳,如需UTC时区替换为ZoneId.of("UTC") long seconds = localDateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond(); long millis = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); System.out.println("秒级Unix时间戳:" + seconds); System.out.println("毫秒级Unix时间戳:" + millis); } }
兼容旧版本方案(使用SimpleDateFormat)
如果需要兼容Java 8以下版本,可使用SimpleDateFormat,但该类非线程安全,多线程环境需谨慎使用。
示例代码:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class OldTimeConverter { public static void main(String[] args) throws ParseException { String timeStr = "Feb 11 2023 9:35:41 PM"; // 指定英文Locale解析月份缩写 SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy h:mm:ss a", Locale.ENGLISH); Date date = sdf.parse(timeStr); long seconds = date.getTime() / 1000; long millis = date.getTime(); System.out.println("秒级Unix时间戳:" + seconds); System.out.println("毫秒级Unix时间戳:" + millis); } }
关键注意点
- 时区问题:Unix时间戳基于UTC时区,若使用系统默认时区转换,结果会随运行环境时区变化。如需统一UTC时间,将
ZoneId.systemDefault()替换为ZoneId.of("UTC")即可。 - 月份缩写解析:必须指定英文
Locale,否则在非英文系统环境下会无法识别Feb这类英文月份缩写。
内容的提问来源于stack exchange,提问作者hknkaras
相关产品推荐
相关产品推荐

