【发布时间】:2018-06-17 11:50:16
【问题描述】:
我有一些代码接收解析的DateTimeFormatter 实例。
现在在某些情况下,我发现那里没有时区/偏移信息,因此我遇到了解析错误(异常)。
为了避免这些错误,我想在未指定任何内容时“强制”使用默认时区/偏移量,例如 ZoneOffset.UTC。
到目前为止,我还没有找到一种“干净且有文档记录”的方法来执行此操作。
在此示例中,getZone() 方法返回 null
ParseCaseSensitive(false)Value(DayOfMonth,2)'/'Text(MonthOfYear,SHORT)'/'Value(Year,4)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)'.'Value(MilliOfSecond,3)' 'Offset(+HHMM,'+0000')
到目前为止,我想出的最好方法是执行一个“toString()”,然后检查其中是否存在所需的子字符串,如下所示:
String formatterExpression = formatter.toString();
if (formatterExpression.lastIndexOf("Offset(") == -1 &&
formatterExpression.lastIndexOf("ZoneText(") == -1
) {
formatter = formatter.withZone(defaultZone);
LOG.error("The timestamp format \"{}\" does NOT contain a timezone so we assume \"{}\".",
formatter.toString(), defaultZone.getDisplayName(TextStyle.SHORT, Locale.ENGLISH));
}
这样做的正确方法是什么?
其他背景信息 此代码是系统的一部分,该系统允许解析使用 strftime 格式指定格式的日期/时间文本。
见:
【问题讨论】:
-
你的意思是你收到了一个由
DateTimeFormatter.ofPattern方法之一生成的DateTimeFormatter对象(在它解析了格式模式字符串之后)?或者您的意思是您收到来自DateTimeFormatter.parse方法之一的TemporalAccessor?抱歉,不是很清楚。 -
恕我直言,您“序列化”格式化程序的想法不是一个好主意。不让
DateTimeFormatter可序列化是一个明智的设计决定。与其像格式化程序那样“格式化”和“重新解析”固有的复杂对象,不如只发送格式化模式字符串以及区域 ID 和区域设置,这样接收者就可以轻松地重建原始格式化程序。
标签: java datetime java-8 timezone timezone-offset