我想将这个字符串转换为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: 格式无效:"周四 8 月 29 日 17:46:11" at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) at org.joda.time.LocalDateTime.parse(LocalDateTime.java:168)
tl;博士
仅供参考,Joda-Time项目现在处于维护模式,建议迁移到java.time类。请参阅甲骨文教程。
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
只有日期和时间,但缺少时区或 UTC 偏移量的上下文。
试图将您的输入作为LocalDateTime
来处理意味着丢弃有价值的信息。这就像将一笔钱简单地处理为BigDecimal
,同时丢弃有关哪种货币的信息。
OffsetDateTime
输入字符串包括提前五个半小时的 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.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧传统日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换java.time对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要java.sql.*
类。
从哪里获得java.time类?
Java SE 8、Java SE 9、Java SE- 10、Java SE 11及更高版本 - 标准 Java API 的一部分,具有捆绑实现。
- Java 9添加了一些小功能和修复。
Java SE 6 和 Java - SE7
- 大多数java.time功能在ThreeTen-Backport中向后移植到 Java 6 和 7。
Android - 更高版本的java.time类的 Android 捆绑实现。
- 对于早期的Android(<26),ThreeTenABP项目适应了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP...。
请注意,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
)。
链接
- 乔达时代主页
- 相关问题:Joda Time 使用时区解析日期并保留该时区
- 带有格式模式字母(包括其大小写)的
org.joda.time.format.DateTimeFormat
文档
您提供的用于解析的格式字符串看起来与您实际获得的文本格式不正确。您需要先解析,然后格式化。只需在代码下面测试,
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();
}