当前位置: 首页 > 知识库问答 >
问题:

java.time.DateTimeException:无法从时间提取ZoneId

梁丘缪文
2023-03-14

当我运行第一段时,它非常好并生成输出。但是在第二种情况下,当我运行这个段2时,它生成

DateTimeException : Unable to extract ZoneId from temporal.

第1部分:

LocalDate ld = LocalDate.now();
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(ld));

第2部分:

LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
System.out.println(dtf.format(ldt));

共有2个答案

支彭亮
2023-03-14

您混淆了“本地化”和“本地”:

>

  • ofLocalizedDateTime:返回特定于语言环境的日期时间格式化程序

    LocalDateTime:没有时区的日期时间

    如你所见,它们是两个完全不同的术语。

    现在,尝试提供一个ZonedDateTime值,这样您就可以了解为什么它需要一个ZoneId。

    ZonedDateTime zdt = ZonedDateTime.now();
    DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
    System.out.println(dtf.format(zdt));
    

    输出(语言环境:en_US,时区:America/New_York

    Monday, December 30, 2019 at 8:09:16 AM Eastern Standard Time
    

    正如你所见,它需要时区来知道时间是“东部标准时间”。

    如果将时间样式从“完全”减少到“中等”,则不再需要时区。

    LocalDateTime ldt = LocalDateTime.now();
    DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM);
    System.out.println(dtf.format(ldt));
    

    输出

    Monday, December 30, 2019, 8:09:16 AM
    

  • 叶俊郎
    2023-03-14

    我认为解释起来有点复杂,因为你把两件事混为一谈,一是定位数据时间(calizeddate),二是格式化风格(FormatStyle):

    在第一种情况下,您使用FormatStyle调用localizeddate。完全,因此您忽略了时间部分。

    在第二种情况下,您也使用FormatStyle调用LocalizedDateTime。完整的,包括日期的所有部分,而不是本地日期或本地日期时间。

    可以肯定的是,让我们尝试使用MEDIUMSHORT而不是FULL

    DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(ldt)
    => 30 déc. 2019 à 14:57:40 - without any exception 
    

    有关更多详细信息,请查看此处的评论:

    /**
     * Full text style, with the most detail.
     * For example, the format might be 'Tuesday, April 12, 1952 AD' or '3:30:42pm PST'.
     */
    FULL,
    /**
     * Long text style, with lots of detail.
     * For example, the format might be 'January 12, 1952'.
     */
    LONG,
    /**
     * Medium text style, with some detail.
     * For example, the format might be 'Jan 12, 1952'.
     */
    MEDIUM,
    /**
     * Short text style, typically numeric.
     * For example, the format might be '12.13.52' or '3:30pm'.
     */
    SHORT;
    

    要继续,我们可以创建此表:

     类似资料:
    • 我一直在与服务器使用改型的响应进行斗争。 Logcat正在打印JSONObject,但它在

    • 我对Gatling/Scala完全陌生。 我有一个场景要执行。它是这样的: -->改变员工的轮班时间。 请帮助执行上述操作。一个步骤的详细解释将非常感谢考虑到我是完全新的这一点。 谢了!

    • 我使用这个库在我的Android应用程序中使用FFmpeg。我正在从视频中提取帧,然后将它们添加到裁剪查看器中。因此,每一帧都需要表示视频中的某个时间帧。下面是我当前提取帧的ffmpeg代码: 感谢任何帮助

    • 我有登录请求,在请求中我获得了JSESSIONID和XSRF-TOKEN作为Cookie数据,如下所示 如果需要,如何从响应中提取JSESSIONID,以便在注册Cookie中传递该变量 在此处输入图像描述

    • 在运行我的程序后,我得到这个奇怪的崩溃发生大约2个小时运行它,说明它不能解析日期。 有没有人知道它为什么会给这个?因为当我在网上寻找,我发现它可能是由于一个不正确的格式,但由于我没有指定的格式这不是我的情况。 解析我的时间戳的代码如下: 注意:方法返回一个字符串,如: 更新#1:以下代码重复了此问题: 生成以下stacktrace