Java 字符串datetime转换为LocalDateTime对象
我想将此字符串转换为Java 字符串datetime转换为LocalDateTime对象,java,jodatime,android-jodatime,Java,Jodatime,Android Jodatime,我想将此字符串转换为LocalDateTime对象。我该怎么做 “周四8月29日17:46:11格林尼治标准时间+2019年5: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 = DateT
LocalDateTime
对象。我该怎么做
“周四8月29日17:46:11格林尼治标准时间+2019年5: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)
tl;博士
仅供参考,该项目目前正在进行中,建议迁移到类。看
2019-08-29T17:46:11+05:30
LocalDateTime
不能表示一个时刻
“2019年8月29日星期四17:46:11 GMT+05:30”
我想将此字符串转换为LocalDateTime对象
你不能
- 输入代表一个时刻,时间线上的一个特定点李>
不能表示一个时刻。LocalDateTime
只有日期和时间,但缺少时区上下文或UTC偏移量LocalDateTime
LocalDateTime
处理意味着丢弃有价值的信息。这就好比把一笔钱当作一个简单的BigDecimal
来处理,同时扔掉关于哪种货币的信息
OffsetDateTime
您输入的字符串包含一个提前五个半小时的字符串。因此,将其解析为对象
使用类定义自定义格式模式以匹配输入
定义
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
提示:这种输入格式很糟糕。教育这些输入字符串的发布者实用日期时间格式的标准
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 该项目现已启动,建议迁移到类 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(您为解析提供的格式字符串与您实际使用的文本格式不符。您需要先解析,然后格式化。只需测试下面的代码
请注意,Joda Time被认为是一个基本上已“完成”的项目。 没有计划进行重大增强。如果使用Java SE 8,请迁移 到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(); }
(JSR-310) 这是从Joda Time主页上引述的。我应该说,它支持Basil Bourque的答案。无论如何,如果你现在坚持Joda Time,答案是:java.time
输出: 2019-08-29T17:46:11.000+05:30final 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);
- 格式为模式字符串
- 您需要
表示星期几。EEE
表示月日d
- 您需要小写的
表示月日;大写的dd
表示年日dd
- 我加入了
,因为根据文档,这是用冒号进行偏移;ZZ
在实践中也起作用Z
- 您需要
- 因为Thu和Aug是英语的,所以您需要一个说英语的区域设置。因为我相信您的字符串最初来自总是产生英语的
,所以我觉得Date.toString()
是合适的locale.ROOT
- 我发现解析为
更好。为了保留字符串的偏移量,我们需要通过DateTIme
(如果需要,您以后可以随时转换为withOffsetParsed()
)LocalDateTime
- 相关问题:
- 使用格式模式字母,包括其大小写
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);
- 格式为模式字符串