我想将此字符串转换为LocalDateTime
对象。我该怎么办?
“ 2019年8月29日星期四17:46:11 GMT + 05:30”
我已经尝试了一些东西,但是没有用。
final String time = "Thu Aug 29 17:46:11 GMT+05:30 2019";
final String format = "ddd MMM DD HH:mm:ss 'GMT'Z YYYY";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format);
LocalDateTime localDateTime = LocalDateTime.parse(time, dateTimeFormatter);
线程“ main”中的异常java.lang.IllegalArgumentException:无效格式:“ Thu Aug 29 17:46:11” 在org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) 在org.joda.time.LocalDateTime.parse(LocalDateTime.java:168)
答案 0 :(得分:4)
仅供参考,Joda-Time项目现在位于maintenance mode中,建议迁移到java.time类。参见Tutorial by Oracle。
OffsetDateTime.parse(
"Thu Aug 29 17:46:11 GMT+05:30 2019" ,
DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu").withLocale( Locale.US )
)
.toString()
2019-08-29T17:46:11 + 05:30
LocalDateTime
不能代表片刻“ 2019年8月29日星期四17:46:11 GMT + 05:30”
我想将此字符串转换为LocalDateTime对象。
您不能。
LocalDateTime
不能代表片刻。 LocalDateTime
仅具有日期和时间,但是缺少时区或从UTC偏移的上下文。尝试将您的输入作为LocalDateTime
处理就意味着丢弃有价值的信息。这就像处理BigDecimal
一样简单的金额,同时丢掉有关哪种货币的信息。
OffsetDateTime
您输入的字符串包括提前五个半小时的offset-from-UTC。因此,解析为OffsetDateTime
对象。
使用DateTimeFormatter
类定义自定义格式设置样式以匹配您的输入。
定义
String input = "Thu Aug 29 17:46:11 GMT+05:30 2019" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu").withLocale( Locale.US );
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
odt.toString():2019-08-29T17:46:11 + 05:30
提示:该输入格式很糟糕。对这些输入字符串的发布者进行有关实用日期时间格式的标准ISO 8601的教育。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
答案 1 :(得分:3)
请注意,Joda-Time被认为是很大程度上“完成”的项目。 没有计划进行重大增强。如果使用Java SE 8,请迁移 到
java.time
(JSR-310)。
此引用来自Joda-Time主页。我应该说,它赞同巴西尔·布尔克的回答。无论如何,如果您现在坚持使用Joda-Time,答案是:
final String time = "Thu Aug 29 17:46:11 GMT+05:30 2019";
final String format = "EEE MMM dd HH:mm:ss 'GMT'ZZ YYYY";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format)
.withLocale(Locale.ENGLISH)
.withOffsetParsed();
DateTime dateTime = DateTime.parse(time, dateTimeFormatter);
System.out.println(dateTime);
输出:
2019-08-29T17:46:11.000 + 05:30
EEE
。 d
是每月的一天。dd
;大写字母DD
用于一年中的某天ZZ
,因为根据文档,这是用冒号代替的; Z
在实践中也可以Date.toString()
,并且始终会产生英语,因此我认为Locale.ROOT
是合适的。DateTIme
更好。为了保留字符串的偏移量,我们需要通过withOffsetParsed()
指定该偏移量(如果需要,您以后随时可以转换为LocalDateTime
)。答案 2 :(得分:1)
您提供的用于解析的格式字符串与您实际获得的文本格式不匹配。您需要先解析,然后再格式化。只需测试以下代码,
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.getDefault());
Date dt = null;
try {
dt = format.parse("Thu Aug 29 17:46:11 GMT+05:30 2019");
SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a");
String output = out.format(dt);
Log.e("OUTPUT",output);
} catch (Exception e) {
e.printStackTrace();
}