java我可以在DateTimeFormatterBuilder的格式之间切换吗?
我使用DateTimeFormatterBuilder()将我接收的JSON数据(注释代码)转换为两种格式之一。为了决定使用哪种格式,我使用一个正则表达式来查找正方形、[]括号的任何实例(在“*?”内有任何内容)。选择正确的格式后,我会将新值解析为另一个JSON对象
问题是,我的程序要么没有正确选择要使用的格式(要么是正则表达式和方法错误),要么没有正确设置格式(格式错误),不确定是哪种格式,而是发回一个错误(代码底部)
但是,这仅适用于具有方括号的数据。正确处理不带方括号的数据。我想知道是否有任何解决方案/建议来解决这个问题
// 2018-11-28T13:09:00.2-04:00
def utcDateFormatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
.appendPattern("xxx")
.toFormatter()
// 2018-11-28T13:09:00.528-08:00[America/New_York]
def utcDateFormatterWithZone = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
.appendPattern("xxx'['VV']'")
.toFormatter()
if (json.beginDateTime.find("\\[.*?\\]") == true) {
object.setDate(LocalDateTime.parse("${json.beginDateTime}", utcDateFormatterWithZone).format(outFormatter))
} else {
object.setDate(LocalDateTime.parse("${json.beginDateTime}", utcDateFormatter).format(outFormatter))
}
Error: Text '2019-09-26T15:01:07.941-05:00[America/New_York]' could not be parsed, unparsed text found at index 29
# 1 楼答案
这是内置的:DateTimeFormatter。ISO分区日期时间
这可以做得容易得多。内置的
DateTimeFormatter.ISO_ZONED_DATE_TIME
与这两种格式都匹配此代码段的输出为:
也使用偏移量
不过,有一个警告:您确定要忽略字符串中的偏移量吗?通过这些偏移量,字符串表示时间上明确的点。从解析到
< P>考虑解析到{{CD3}}。一个argLocalDateTime
中得到的是属于不同未知偏移量的日期时间。我看不出你如何能可靠地将它们用于任何有用的事情ZonedDateTIme.parse
甚至可以在没有任何显式格式化程序的情况下执行此操作。然后将这些ZonedDateTime
直接存储在对象中,或者转换为Instant
并存储它们。一个Instant
表示一个时间点。如果无法更改存储的类型,可能需要将ZonedDateTime
转换为UTC(或另一个约定的时区),然后转换为LocalDateTime
。所有这些都是在不知道你的真实需求的情况下说的,所以我可能是错的,只是我认为不是你的代码出了什么问题
@daggett是正确的:
CharSequence.find
返回一个字符串,因此要使if
语句正常工作,您需要:A
String
永远不能等于true
,因此始终选择不带区域的格式化程序链接
Documentation of ^{}