|
|
旅行中的充值卡 · 生成播放列表-阿里云帮助中心· 1 年前 · |
|
|
憨厚的佛珠 · 开源大屏项目 - 掘金· 1 年前 · |
|
|
爱热闹的小马驹 · Python兼职私活接单方法大曝光,这七种方 ...· 2 年前 · |
|
|
纯真的生姜 · Unity中让敌人跟随玩家,并在接触玩家时停 ...· 2 年前 · |
|
|
不拘小节的米饭 · 深入理解Linux进程控制(代码+图解) - 知乎· 2 年前 · |
我只是尝试在Java8中将日期字符串转换为DateTime对象。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
我得到以下错误:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
语法与
here
建议的语法相同,但我得到了一个例外。我正在使用
JDK-8u25
。
事实证明,Java不接受纯日期值作为DateTime。使用LocalDate而不是LocalDateTime解决了这个问题:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
这是一个非常不清楚和没有帮助的错误消息。经过多次尝试和错误,我发现如果您不尝试解析时间,
LocalDateTime
会给出上述错误。通过使用
LocalDate
,它可以在不出错的情况下工作。
这方面的文档很少,相关的异常也没有多大帮助。
如果确实需要将日期转换为LocalDateTime对象,可以使用LocalDate.atStartOfDay()。这将为您提供一个指定日期的LocalDateTime对象,其中的小时、分钟和秒字段设置为0:
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
如果有人(像我一样)应该再读一遍这个主题,那么正确的答案应该是
DateTimeFormatter
定义,例如:
private static DateTimeFormatter DATE_FORMAT =
new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
如果要显示可选字段,则应设置这些字段。其余的代码应该完全相同。
在
retrography's answer
上扩展:即使在使用
LocalDate
而不是
LocalDateTime
时,我也遇到了同样的问题。问题是我使用
.withResolverStyle(ResolverStyle.STRICT);
创建了我的
DateTimeFormatter
,所以我不得不使用日期模式
uuuuMMdd
而不是
yyyyMMdd
(即"year“而不是"year- of -era")!
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseStrict()
.appendPattern("uuuuMMdd")
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);
(这个解决方案最初是对retrography的答案的一种评论,但我被鼓励将其作为一个独立的答案发布,因为它显然对许多人都很有效。)
对于任何带着这个错误登陆的人,就像我一样:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
它来自下面的一句话:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));
事实证明,这是因为我在0小时上使用了12小时模式,而不是24小时模式。
通过使用大写H将小时模式更改为24小时模式可以解决此问题:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));
试试这个:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);
您可以添加所需的任何格式。这对我很有效!
这个很好用
public class DateDemo {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
String date = "16-08-2018 12:10";
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println("VALUE="+localDate);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime parse = LocalDateTime.parse(date, formatter1);
System.out.println("VALUE1="+parse);
}
输出:
VALUE=2018-08-16
VALUE1=2018-08-16T12:10
我遇到这个问题是因为我的输入字符串中没有年份:
输入字符串:
Tuesday, June 8 at 10:00 PM
格式化程序:
DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a", Locale.US);
我知道年份,所以我只需将其附加到get:
输入字符串:
Tuesday, June 8 at 6:30 PM 2021
格式化程序:
DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a uuuu", Locale.US);
DateTimeFormatter format = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.MILLI_OF_SECOND, 0)
.toFormatter();
对我很管用
|
|
旅行中的充值卡 · 生成播放列表-阿里云帮助中心 1 年前 |
|
|
憨厚的佛珠 · 开源大屏项目 - 掘金 1 年前 |
|
|
不拘小节的米饭 · 深入理解Linux进程控制(代码+图解) - 知乎 2 年前 |