- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
Java 8 LocalDateTime is parsing invalid date
(5 个回答)
4年前关闭。
我一直在努力解决 java 8 如何处理将字符串解析为 LocalDateTime
的实例的问题。 .我在为从 String 到 LocalDateTime
的转换编写单元测试时注意到了这一点。 .
下面是一个方法示例(不是实际的),自从 java 8 发布以来我已经使用了一段时间。
private void convertToLocalDateTime(String s) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d HH:mm")
.withResolverStyle(ResolverStyle.STRICT);
try {
LocalDateTime ldt = LocalDateTime.parse(s, formatter);
System.out.println("s: " + s + " -> ldt: " + ldt.toString());
} catch(DateTimeParseException e) {
System.out.println("s: " + s + " -> The field is not a valid date.");
}
}
s.o.p
是为了向您展示显示器。这是一个显示示例;
s: 2016-06-31 11:00 -> ldt: 2016-06-30T11:00
s: 2016-07-31 11:00 -> ldt: 2016-07-31T11:00
s: 2016-08-31 11:00 -> ldt: 2016-08-31T11:00
s: 2016-09-31 11:00 -> ldt: 2016-09-30T11:00
s: 2016-10-31 11:00 -> ldt: 2016-10-31T11:00
s: 2016-11-31 11:00 -> ldt: 2016-11-30T11:00
s: 2016-12-31 11:00 -> ldt: 2016-12-31T11:00
s: 2016-11-0 11:00 -> The field is not a valid date.
s: 2016-11-1 11:00 -> ldt: 2016-11-01T11:00
s: 2016-11-15 11:00 -> ldt: 2016-11-15T11:00
s: 2016-11-30 11:00 -> ldt: 2016-11-30T11:00
s: 2016-11-31 11:00 -> ldt: 2016-11-30T11:00
s: 2016-11-32 11:00 -> The field is not a valid date.
public static DateTimeFormatter ofPattern(String pattern)
Creates a formatter using the specified pattern. This method will create a formatter based on a simple pattern of letters and symbols as described in the class documentation. For example, d MMM uuuu will format 2011-12-03 as '3 Dec 2011'.The formatter will use the default FORMAT locale. This can be changed using withLocale(Locale) on the returned formatter Alternatively use the ofPattern(String, Locale) variant of this method.
The returned formatter has no override chronology or zone. It uses SMART resolver style.
STRICT
.
convertToLocalDateTime(String)
正文中的第一行方法修改为
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d HH:mm")
.withResolverStyle(ResolverStyle.STRICT);
s: 2016-01-31 11:00 -> The field is not a valid date.
s: 2016-02-31 11:00 -> The field is not a valid date.
s: 2016-03-31 11:00 -> The field is not a valid date.
s: 2016-04-31 11:00 -> The field is not a valid date.
s: 2016-05-31 11:00 -> The field is not a valid date.
s: 2016-06-31 11:00 -> The field is not a valid date.
s: 2016-07-31 11:00 -> The field is not a valid date.
s: 2016-08-31 11:00 -> The field is not a valid date.
s: 2016-09-31 11:00 -> The field is not a valid date.
s: 2016-10-31 11:00 -> The field is not a valid date.
s: 2016-11-31 11:00 -> The field is not a valid date.
s: 2016-12-31 11:00 -> The field is not a valid date.
s: 2016-11-0 11:00 -> The field is not a valid date.
s: 2016-11-1 11:00 -> The field is not a valid date.
s: 2016-11-15 11:00 -> The field is not a valid date.
s: 2016-11-30 11:00 -> The field is not a valid date.
s: 2016-11-31 11:00 -> The field is not a valid date.
s: 2016-11-32 11:00 -> The field is not a valid date.
yyyy-MM-dd HH:mm
没有帮助。我怀疑 STRICT 不能很好地处理自定义格式字符串......
LocalDateTime
例如我自己?
最佳答案
你的困惑是有道理的。我发现实际上是一个 DateTimeFormatter
用于图案 "yyyy-MM-dd HH:mm"
,使用 STRICT
解析器样式,甚至拒绝它自己格式化的日期字符串。
经进一步调查,这似乎与DateTimeFormatter
有关。的新(相对于完善的 java.text.SimpleDateFormat
)区分“年份”和“时代”。与 DateTimeFormatter
, 'y'
格式符号代表后者;前者对应格式字母'u'
.事实证明,如果我使用格式字符串 "uuuu-MM-dd HH:mm"
您的程序产生了您似乎正在寻找的输出:
private void convertToLocalDateTime(String s) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-M-d HH:mm")
.withResolverStyle(ResolverStyle.STRICT);
try {
LocalDateTime ldt = LocalDateTime.parse(s, formatter);
System.out.println("s: " + s + " -> ldt: " + ldt.toString());
} catch(DateTimeParseException e) {
System.out.println("s: " + s + " -> The field is not a valid date.");
}
}
DateTimeFormatter
是一个糟糕的选择。与
SimpleDateFormat
的这种不必要的不兼容用于一些最常见的用途。我想我会交换
'u'
的意思和'
y
',从而避免您遇到的那种问题。然而,很明显,这个 API 的设计者不同意,这就是桥下的水。
关于java - DateTimeFormatter 无效日期在 LocalDateTime.parse 之后得到调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41679360/
我有以下字符串表示我需要解析的日期范围: 2018-10-20:2019-10-20 它由 2 个由 分隔的 ISO 日期字符串组成: 通过将重复的日期范围与其他文本混合在一起,字符串可能会变得更加复
我在使用新的 Java Date-API 时遇到问题,尤其是 java.time.DateTimeFormatter。 我正在寻找一种将 TimeZone-Offset 添加到给定时间的方法。 例如
在 Java 8 DateTime API 中,有两种格式化日期的方法,乍一看似乎做同样的事情: DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").for
我使用 ZonedDateTime.now(ZoneOffset.of("+2:00")).minusDays(5) 创建了一个日期。现在我想将其格式化为 yyyy-MM-dd。 在 Java 8+
以下代码: Locale locale = new java.util.Locale("en", "AU"); DateTimeFormatter fmt = DateTimeFormatter.of
这个问题在这里已经有了答案: Error: Text '1/31/2020' could not be parsed at index 0 while trying to parse string d
我正在将我的应用程序从 Joda-Time 迁移到 Java 8 java.time . 我遇到的一件事是使用 DateTimeFormatter 中的模式打印基于周的年份. 注意:我看过这个问题:
这个问题已经有答案了: Why does Java's java.time.format.DateTimeFormatter#format(LocalDateTime) add a year? (2
我使用 DateTimeFormatter 来格式化日期。这是可行的,但是当我尝试将此格式化日期转换回日期时,我遇到了异常。 代码: DateTimeFormatter weekOfYear = Da
我正在尝试解析月份从 1 到 12(而不是从 01 到 12)的日期。 我正在尝试这个: System.out.println(DateTimeFormatter.ofPattern("[[M
我正在尝试使用 DateTimeFormatter API 在 TextView 中显示特定时间,但每当我运行我的应用程序时我的设备设置为阿拉伯语或孟加拉语,不知何故时间似乎总是显示西方数字。这是故意
这个问题已经有答案了: How to get start and end range from list of timestamps? (2 个回答) Converting ISO 8601-comp
我正在改造一些旧的 SimpleDateFormat 代码以使用新的 Java 8 DateTimeFormatter。 SimpleDateFormat 以及旧代码接受日期后面包含内容的字符串,例如
有没有办法拥有这样的 DateTimeFormatter DateTimeFormatter.ofPattern("HH:mm") 它应该转换为 LocalDateTime 并且将缺少的内容归零? 实
是否有与 DateTimeFormatter 的 .appendFraction 方法等效的模式?这就是我想要的,但不必包含 .appendFraction() 和周围的 .可选方法。 Date
这个问题已经有答案了: Why does Java's java.time.format.DateTimeFormatter#format(LocalDateTime) add a year? (2
我正在尝试使用 DateTimeFormatter 格式化当前日期,我几乎得到了我需要的东西,但我的问题似乎是一周中的几天是从星期日而不是星期一开始枚举的。因此,例如,如果我在星期二运行下面的代码 i
LocalDateTime API 可以通过在格式化程序中使用键“z”来添加时区名称。添加此 key 时出现异常,但不明白为什么。我正在寻找类似此示例“11:59:22 PM GMT”而不是“**..
我遇到了一个问题,我绝对无法解决这个问题。我对 Java(或任何语言,就此而言)没有经验,如果这是一个愚蠢的问题,请原谅。 据我所知,java.time.format.DateTimeFormatte
This question already has answers here: Why does Java's java.time.format.DateTimeFormatter#format(Lo
我是一名优秀的程序员,十分优秀!