You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析缺少分钟的日期时间字符串2019-10-12T07Z?

解决Java解析不含分钟的ISO格式日期时间字符串问题

需要解析格式为2019-10-12T07Z的日期时间字符串(仅包含小时,无分钟),原代码如下:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class App 
{
    public static void main( String[] args )
    {
        // 期望解析后输出2019-10-12T07:00:00Z
        OffsetDateTime offSetDateTime = OffsetDateTime.parse("2019-10-12T07Z");
        System.out.println(offSetDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
    }
}

运行后抛出异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-10-12T07Z' could not be parsed at index 13
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
    at java.time.OffsetDateTime.parse(OffsetDateTime.java:387)
    at com.test.offset.offset.App.main(App.java:16)

期望输出:

2019-10-12T07:00:00Z

问题原因

OffsetDateTime.parse()默认使用DateTimeFormatter.ISO_OFFSET_DATE_TIME格式化器,该格式要求时间部分必须包含小时和分钟(格式为HH:mm),而输入字符串仅提供了小时,不符合格式要求,因此解析失败。

解决方案

自定义一个兼容仅小时+时区格式的DateTimeFormatter,同时保留对标准ISO格式的支持,代码修改如下:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;

public class App 
{
    public static void main( String[] args )
    {
        // 自定义格式化器:支持仅小时+时区的格式,同时兼容标准ISO格式
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd'T'HHX")
                .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                .toFormatter()
                .withResolverStyle(java.time.format.ResolverStyle.SMART);

        OffsetDateTime offSetDateTime = OffsetDateTime.parse("2019-10-12T07Z", formatter);
        System.out.println(offSetDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
    }
}

代码说明

  1. appendPattern("yyyy-MM-dd'T'HHX"):定义匹配输入字符串的格式,X代表时区偏移(这里的Z是UTC时区的简写)。
  2. parseDefaulting:为缺失的分钟、秒字段设置默认值0,解析后会自动补全00:00。
  3. withResolverStyle(SMART):使用智能解析模式,确保字段缺失时能正确应用默认值。

运行修改后的代码,即可得到期望的输出:2019-10-12T07:00:00Z。


内容的提问来源于stack exchange,提问作者prasanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:24:40