如何使用Joda Time将自定义日期时间字符串转换为毫秒?以及如何从自定义日期时间字符串创建java.util.Date实例(含报错问题)
解决Joda Time处理自定义日期字符串的两个问题
先帮你解决第二个问题(创建java.util.Date实例)以及你遇到的异常,再解答第一个问题。
问题2:解析自定义日期字符串并创建java.util.Date(修复异常)
你碰到的IllegalArgumentException核心原因是Locale不匹配:Joda Time的DateTimeFormat默认会使用系统Locale,如果你的系统Locale不是英文,解析英文的星期(Fri)、月份(Jul)时就会失败,进而导致后续的时区和年份部分无法正确解析,报错就指向了后面的" UTC 2022"。
修正后的代码
import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.Date; import java.util.Locale; public class DateParser { public static void main(String[] args) { String time = "Fri Jul 29 12:56:35 UTC 2022"; // 指定英文Locale,确保能识别英文的星期、月份缩写 DateTimeFormatter df = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss z yyyy").withLocale(Locale.ENGLISH); long millis = df.parseMillis(time); // 从毫秒数创建java.util.Date实例 Date date = new Date(millis); System.out.println(date); } }
关键说明
- 你写的格式串
"EEE MMM dd HH:mm:ss z yyyy"是完全正确的,对应字符串的各个部分:EEE:星期缩写(Fri)MMM:月份缩写(Jul)dd:日期(29)HH:mm:ss:时分秒(12:56:35)z:时区(UTC)yyyy:年份(2022)
- 添加
.withLocale(Locale.ENGLISH)是解决报错的核心,它强制解析器用英文规则解析日期中的英文标识。
问题1:使用Joda Time将自定义日期时间字符串转换为毫秒
你尝试的df.parseMillis(time)就是正确的转换方式,只需要确保格式串和Locale匹配即可。上面修正后的代码中已经包含了这一步:
String time = "Fri Jul 29 12:56:35 UTC 2022"; DateTimeFormatter df = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss z yyyy").withLocale(Locale.ENGLISH); long millis = df.parseMillis(time); // 这就是转换后的毫秒数
如果需要更严谨的时区控制,可以额外指定解析时区(比如强制按UTC解析):
import org.joda.time.DateTimeZone; // 明确指定解析时使用UTC时区 DateTimeFormatter df = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss z yyyy") .withLocale(Locale.ENGLISH) .withZone(DateTimeZone.UTC); long millis = df.parseMillis(time);
内容的提问来源于stack exchange,提问作者Amine




