- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些代码接收经过解析的 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 格式指定格式的日期/时间文本的系统的一部分。
参见:
最佳答案
我明白你的意思,我也没有找到完美的解决方案,但我想我会分享几个选项。
如果您可以在格式化程序无法解析区域或偏移量的情况下设置像 UTC 这样的偏移量,我建议:
formatter = new DateTimeFormatterBuilder().append(formatter)
.parseDefaulting(ChronoField.OFFSET_SECONDS, ZoneOffset.UTC.getTotalSeconds())
.toFormatter();
我还没有发现这会造成任何伤害的情况。如果格式化程序已经解析了区域或偏移量信息(或包含默认偏移量),则这将无效。如果没有,将使用指定的默认偏移量。
以上不适用于强制执行具有可变偏移量的时区(如夏令时 (DST) 的时区)。要执行一个,我相信您应该解析、获取并捕获异常,然后按照您已经找到的方式执行时区:
ZonedDateTime dateTime;
try {
dateTime = ZonedDateTime.parse(dateTimeString, formatter);
} catch (DateTimeParseException dtpe) {
dateTime = ZonedDateTime.parse(dateTimeString,
formatter.withZone(ZoneId.of("Europe/Amsterdam")));
}
缺点是 catch 子句还会捕获与丢失的偏移量或区域无关的错误。您可能会尝试解析异常消息,但我相信这只会给您留下一个类似于您开始时遇到的问题。我不会打扰。
恕我直言,我们真正缺少的是获取格式化程序知道如何格式化和解析的字段的 getter。不过,对于复杂的格式化程序,这种方法的设计和使用将具有挑战性,所以我倾向于理解他们为什么不提供这种方法。
关于java - 确定 Java 8 DateTimeFormatter 是否包含足够的时区信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48151335/
对于我的问题,我找不到更好的措辞。 在我的应用程序中的某个时刻,我设置了一些非常密集的动画。问题是,在高端设备上,动画运行流畅且赏心悦目。另一方面,我测试过的一台低端设备在制作动画时表现非常糟糕。 试
我正在修补 OTP 模块 ( yubico_pam ),并尝试访问管理员选择的控制标志(例如必需,足够, ETC)。 有什么想法吗?这是否可行(无需解析文件)? 最佳答案 无法在 API 中查询此信息
我有一些为 Linux 编写的 C 代码,依赖于套接字和 arpa/inet.h 以及 libusb.h,我想在 MinGW 下为 Windows 编译它。 (请注意,当前项目只有一个非常简单的 Ma
我是一名优秀的程序员,十分优秀!