当时间为以下格式时,如何为 java.time.format.DateTimeFormatter 选择模式:“Jan 17 2019 03:38:06 GMT+00:00” [duplicate]

How to choose a pattern for java.time.format.DateTimeFormatter when the time is of this format: "Jan 17 2019 03:38:06 GMT+00:00" [duplicate]

提问人:Steve 提问时间:4/28/2023 最后编辑:deHaarSteve 更新时间:5/2/2023 访问量:65

问:

我有以下代码:

try {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss 'GMT'xxx");
    logger.debug("formatter: " + formatter);
    ZonedDateTime zdt = ZonedDateTime.parse(rtime, formatter);
} catch (DateTimeParseException e) {
    if (logger.isDebugEnabled()) {
        logger.debug("Failed to parse device time [" + rtime + "] ", e);
    }
}

rtime这里是Jan 17 2019 03:38:06 GMT+00:00

调试正在打印输出

formatter: Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)' ''GMT'Offset(+HH:MM,'+00:00')`

错误是:

Failed to parse device time [Jan 17 2019 03:38:06 GMT+00:00] 
java.text.ParseException: Unparseable date: "Jan 17 2019 03:38:06 GMT+00:00"

我尝试了几种模式,但总是失败。
有人可以帮忙吗?

java 时间 datetimeformatter

评论

0赞 Stultuske 4/28/2023
格式不取决于“现在是什么时间”。这取决于你需要得到什么。rtime是什么类型?
0赞 Steve 4/28/2023
rtime 是一个字符串。我有一个将纪元时间作为参数的方法,我的目标是使用 zdt.toInstant().toEpochMilli() 获取纪元时间
0赞 Stultuske 4/28/2023
我复制并运行了您的代码,它在这里工作正常。@user16320675建议,请检查您的区域设置。
0赞 Steve 4/28/2023
添加 .谢谢大家的帮助。Locale.ROOT
0赞 Anonymous 4/28/2023
这不可能是对的。您正在捕获 ,但您的输出报告了一个 .该输出不能来自该代码。DateTimeParseExceptionjava.text.ParseException

答:

1赞 deHaar 4/28/2023 #1

你的两个主要问题:DateTimeFormatter

  • 缺少 ,这可能会导致 被使用,并且人们可能不知道缩写(例如,a would expect 而不是LocaleLocale.getDefault()Locale.ITALIANgenJan)
  • 时区错误的模式字母(包含过时的偏移符号,从格林威治标准时间开始的小时String)

你可以像这样解析它:

public static void main(String[] args) {
    String rtime = "Jan 17 2019 03:38:06 GMT+00:00";
    try {
        DateTimeFormatter formatter = 
                DateTimeFormatter.ofPattern("MMM dd uuuu HH:mm:ss VV", Locale.ENGLISH);
        System.out.println("formatter: " + formatter);
        ZonedDateTime zdt = ZonedDateTime.parse(rtime, formatter);
        System.out.println(zdt);
    } catch (DateTimeParseException e) {
        System.err.println("Failed to parse device time [" + rtime + "] ");
    }
}

输出:

2019-01-17T03:38:06Z[GMT]

您可以使用不同的输出来创建不同的输出。DateTimeFormatter


如果您对输入 s 有影响,最好建议您从中移除 ,只使用 ,它可以用来创建一个 .StringGMT+00:00OffsetDateTime