我在java中解析日期时遇到了麻烦,我有一个奇怪的日期时间格式。
如何在java中解析2013-04-03T17:04:39.9430000+03:00
日期时间以格式化java中的dd.MM.yyyy HH:mm
?
答案 0 :(得分:17)
有问题的“奇怪”格式是ISO-8601 - 它被广泛使用。您可以使用SimpleDateFormat以最重要的方式重新格式化它:
SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime dtIn = inFormat.parse(dateString}); //where dateString is a date in ISO-8601 format
SimpleDateFormat outFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm");
String dtOut = outFormat.format(dtIn);
//parse it into a DateTime object if you need to interact with it as such
会为您提供您提到的格式。
答案 1 :(得分:9)
OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" ).format( DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ) )
正如其他人所说,你的格式根本不奇怪。实际上它是一种标准格式。该格式是ISO 8601格式定义的集合之一。
一秒小数的七位数.9430000
代表nanoseconds。与最早版本的Java(java.util.Date/.Calendar/java.text.SimpleDateFormat)捆绑在一起的旧日期时间类仅为milliseconds(小数部分的三位数)构建。这些输入值无法由旧类处理。
幸运的是,Java现在有了更新的日期时间类来取代那些旧类。新的是java.time框架。这些新类可以处理纳秒(最多九位小数),所以没有问题。
java.time框架内置于Java 8及更高版本。在JSR 310中定义。许多功能都被反向移植到Java 6& ThreeTen-Backport项目中的7,并在ThreeTenABP项目中进一步适用于Android。
OffsetDateTime
OffsetDateTime
表示时间轴上带有offset-from-UTC的时刻。您的输入字符串2013-04-03T17:04:39.9430000+03:00
的偏移量比UTC提前三个小时。
在解析/生成字符串时,java.time类默认使用ISO 8601格式。因此无需定义格式化模式。我们可以直接解析该字符串。
OffsetDateTime odt = OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" );
要生成相同样式的字符串表示形式,请调用其toString
方法。
对于不同的格式,定义格式化模式。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" );
String output = odt.format( formatter );
请注意,您的输入具有偏离UTC但不是真正的时区。时区是用于处理夏令时(DST)等异常的偏移加规则。对于真正的时区,请使用ZoneId
获取ZonedDateTime
。搜索Stack Overflow有很多例子。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:0)
对于在java中使用日期和时间的认真工作,我建议使用比Calendar更好的实现。我会使用Joda,然后您可以使用DateTimeFormatter
答案 3 :(得分:0)
请使用此方法解析没有任何库的ISO8601日期。 http://www.java2s.com/Code/Java/Data-Type/ISO8601dateparsingutility.htm
public static Date parseISO8601Date(String input ) throws java.text.ParseException {
//NOTE: SimpleDateFormat uses GMT[-+]hh:mm for the TZ which breaks
//things a bit. Before we go on we have to repair this.
SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssz" );
//this is zero time so we need to add that TZ indicator for
if ( input.endsWith( "Z" ) ) {
input = input.substring( 0, input.length() - 1) + "GMT-00:00";
} else {
int inset = 6;
String s0 = input.substring( 0, input.length() - inset );
String s1 = input.substring( input.length() - inset, input.length() );
input = s0 + "GMT" + s1;
}
return df.parse( input );
}