Java 8 Java 8 DateFormatBuilder API构建ISO 8601日期格式

Java 8 Java 8 DateFormatBuilder API构建ISO 8601日期格式,java-8,date-formatting,Java 8,Date Formatting,我正在尝试构建一个ISO8601格式(“yyyy-MM-dd'T'HH:MM:ss.SSSXXX”)。Ia m使用Java 8 DateFormatBuilder解析ISO 8601格式的字符串 当我遇到UTC时间时,格式化的输出是“2016-11-01T16:51:35.000Z”,但我真正需要的是00:00而不是Z。我尝试了DateFormatBuilder来构建它,但没有成功 最后我做了以下几件事 DateTimeFormatterBuilder builder = new DateTim

我正在尝试构建一个ISO8601格式(“yyyy-MM-dd'T'HH:MM:ss.SSSXXX”)。Ia m使用Java 8 DateFormatBuilder解析ISO 8601格式的字符串

当我遇到UTC时间时,格式化的输出是“2016-11-01T16:51:35.000Z”,但我真正需要的是00:00而不是Z。我尝试了DateFormatBuilder来构建它,但没有成功

最后我做了以下几件事

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DATETIMEFOMATTER = builder.parseCaseInsensitive()
                .append(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
                .toFormatter();

ZonedDateTime zonedDate = ZonedDateTime.parse(date, DATETIMEFOMATTER);
        String utcDate = zonedDate.format(FORMATTER);
        if (utcDate.indexOf("Z") != -1){
            utcDate = utcDate.replace("Z", "-00:00");
        }
我不想解析字符串并用“00:00”替换Z。JodaAPI更易于使用。知道我们是否可以使用Java8DateTimeFormatterBuilder进行构建吗?我确实提了几个问题,但没用。我可能做错了什么。有人能帮忙吗?

内置 java.time类内置了对日期时间值的ISO 8601标准格式的支持。无需指定格式化模式

类可以直接解析输入字符串

要生成一个类似的字符串,按三位(0、3、6或9位)分组生成所需的小数位数,只需调用
toString()

2016-11-01T16:51:35Z

Z
是商业、航空航天和军事领域的标准和通用产品。
Z
Zulu
的缩写,表示UTC

虽然
Z
应该是完全可以接受的,但您似乎要求将UTC的偏移量作为零小时零分钟,
+00:00
。虽然零小时和分钟的正数也是可以接受的,负的
-00:00
是不可接受的,并且违反了ISO 8601。您的问题使用的负零偏移量需要替换为正零

请注意,假定是ISO 8601的配置文件,但却违反了这一规则,允许负零偏移,并给出了一个特殊且令人困惑的含义。不是RFC 3339中唯一糟糕的设计决策。因此,我建议避免RFC,严格遵守ISO8601

要轻松获得所需的字符串,且不必显式地使用
DateTimeFormatter
,请使用
OffsetDateTime
,同时指定已定义为常量的UTC偏移量
ZoneOffset.UTC
。然后只需调用
toString

String output = instant.toString();
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
String output = odt.toString();
2016-11-01T16:51:35+00:00

内置 java.time类内置了对日期时间值的ISO 8601标准格式的支持。无需指定格式化模式

类可以直接解析输入字符串

要生成一个类似的字符串,按三位(0、3、6或9位)分组生成所需的小数位数,只需调用
toString()

2016-11-01T16:51:35Z

Z
是商业、航空航天和军事领域的标准和通用产品。
Z
Zulu
的缩写,表示UTC

虽然
Z
应该是完全可以接受的,但您似乎要求将UTC的偏移量作为零小时零分钟,
+00:00
。虽然零小时和分钟的正数也是可以接受的,负的
-00:00
是不可接受的,并且违反了ISO 8601。您的问题使用的负零偏移量需要替换为正零

请注意,假定是ISO 8601的配置文件,但却违反了这一规则,允许负零偏移,并给出了一个特殊且令人困惑的含义。不是RFC 3339中唯一糟糕的设计决策。因此,我建议避免RFC,严格遵守ISO8601

要轻松获得所需的字符串,且不必显式地使用
DateTimeFormatter
,请使用
OffsetDateTime
,同时指定已定义为常量的UTC偏移量
ZoneOffset.UTC
。然后只需调用
toString

String output = instant.toString();
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
String output = odt.toString();
2016-11-01T16:51:35+00:00


? 你在问题中写了格式,我不确定问题是什么。这对我不起作用。请定义“不起作用”。发布尝试和异常/或发生的其他事件??你在问题中写了格式,我不确定问题是什么。这对我不起作用。请定义“不起作用”。在尝试之后,以及异常/或发生的其他情况?我需要来自同一函数的这两个输出2016-10-31T17:10:10.304-04:00和2016-11-01T16:51:35.000-00:00。我会看看这是否可行。我必须将-00:00作为一种格式,因为我正在使用的服务需要这种格式。@Milind重新阅读我的答案,因为我警告不要使用负零。至于需要
-04:00
,我认为类名
OffsetDateTime
将是一个线索。您是否费心查看类文档?我将使用它并返回给您..谢谢您的回答。@Basil Bourque非常好地解释了我需要从同一函数中获得这两个输出2016-10-31T17:10:10.304-04:00和2016-11-01T16:51:35.000-00:00。我会看看这是否可行。我必须将-00:00作为一种格式,因为我正在使用的服务需要这种格式。@Milind重新阅读我的答案,因为我警告不要使用负零。至于需要
-04:00
,我认为类名
OffsetDateTime
将是一个线索。你有没有费心看一下课堂文档?我会用它然后再给你回复。谢谢你的回复。@Basil Bourque解释得很好