如何将字符串转换为日期对象?
String date="2006-06-21T15:57:24.000Z";
如何在不更改Android格式的情况下将此String转换为Date
对象?
使用Time类并解析字符串。 然后使用Time toMillis()函数并实例化Date。
http://developer.android.com/reference/android/text/format/Time.html#parse3339(java.lang.String)
这里有简单的代码:
private Date parseDate(String date) { SimpleDateFormat curFormater = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.S'Z'"); Date dateObj = new Date(); try { dateObj = curFormater.parse(date); } catch (ParseException e) { e.printStackTrace(); } return dateObj; }
请参阅SimpleDateFormat, http://developer.android.com/reference/java/text/SimpleDateFormat.html
此类使用给定模式将字符串转换为日期,反之亦然。
一旦使用正确的模式创建了SimpleDateFormat,就可以使用它将字符串转换为Date,根据需要使用日期,并最终使用相同的SimpleDateFormat实例将Date转换回String。
编辑:关于时区的澄清
在问题中没有指定给定字符串是否是“纯”ISO 8601日期,并且在这种情况下是否需要支持多个时区,如果该时区将仅表示为数字(在RFC中为+0200) 822),带冒号的数字(ISO 8601允许的+02:00)或名称(EST等…)。
如果字符串是纯ISO 8601字符串,则SimpleDateFormat在解码时区时会遇到一些问题。 但是,如果它是“总是Z”(意味着时区数据没有意义,你可以安全地忽略它),或者使用没有冒号的数字(如+0200等……),或者使用时区名称,那么SimpleDateFormat可以正确处理它。
我来到这里是因为这应该是一个回答的问题, 在Java中隐藏RFC3339 DateTime to Date 。 但是,自API级别22起, Time
是Android中不推荐使用的类。
一个简单的答案就是基于这个 :
import com.google.api.client.util.DateTime; Date date = new Date(new DateTime("2006-06-21T15:57:24.000Z").getValue());
TL;博士
如何将此String转换为Date对象
Date
由java.time.Instant
取代。
Instant.parse( "2006-06-21T15:57:24.000Z" )
不改变这种格式
日期时间对象没有“格式”。 只有文字有格式。
String output = instant.toString() ; // Generate text in a `String` object in standard ISO 8601 format that represents the value of the `Instant` date-time object.
ISO 8601
该输入字符串恰好采用标准ISO 8601格式。 最后的Z
是Zulu
缩写,意思是UTC 。
java.time
在解析和生成表示日期时间值的字符串时,java.time类默认使用ISO 8601格式。
Instant
类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。
Instant instant = Instant.parse( "2006-06-21T15:57:24.000Z" );
要生成标准ISO 8601格式的String,请调用toString
。
String output = instant.toString();
2006-06-21T15:57:24Z
字符串!=日期时间
不要将日期时间对象与表示该值的String混淆。 date-time对象可以解析String,并且可以生成String,但不是String。 换句话说,String可以是输入和/或输出,但不是日期时间对象本身。
所以你的问题,“如何在不改变这种格式的情况下将此String转换为Date对象”是没有意义的。
要以ISO 8601以外的格式生成String,请将Instant
转换为OffsetDateTime
或ZonedDateTime
对象,并使用DateTimeFormatter
类。 搜索DateTimeFormatter
Stack Overflow以查看更多讨论和许多示例。
转变
您应尽可能避免使用旧的java.util.Date
类。 但是,如果必须与尚未更新为java.time类型的旧代码接口,则可以通过添加到旧日期时间类的新方法转换为/从java.time转换。
java.util.Date utilDate = java.util.Date.from( instant );
……走向另一个方向……
Instant instant = utilDate.toInstant();
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
您可以直接与数据库交换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增加了一些小function和修复。
- Java SE 6和Java SE 7
- 大多数java.timefunction都在ThreeTen- Backport中反向移植到Java 6和7。
- Android的
- 更高版本的Android捆绑java.time类的实现。
- 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….