You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动