非法模式字符';T';将日期字符串解析为java.util.date时
我有一个日期字符串,我想使用java date API将其解析为正常日期,以下是我的代码:非法模式字符';T';将日期字符串解析为java.util.date时,java,date,simpledateformat,iso8601,Java,Date,Simpledateformat,Iso8601,我有一个日期字符串,我想使用java date API将其解析为正常日期,以下是我的代码: public static void main(String[] args) { String date="2010-10-02T12:23:23Z"; String pattern="yyyy-MM-ddThh:mm:ssZ"; SimpleDateFormat sdf=new SimpleDateFormat(pattern); try { Date d
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
但是,我得到了一个异常:java.lang.IllegalArgumentException:非法模式字符“T”
所以我想知道是否必须拆分字符串并手动解析它
顺便说一句,我尝试在T的两边添加一个引号字符:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
它也不起作用。更新Java 8及更高版本
现在,您只需执行Instant.parse(“2015-04-28T14:23:38.521Z”)
即可获得正确的结果,尤其是因为您应该使用Instant
而不是最新版本的java.util.Date
您应该使用DateTimeFormatter
而不是SimpleDateFormatter
原始答复:
下面的解释就格式所代表的内容而言仍然有效。
但它是在Java8普及之前编写的,所以它使用旧的
在使用Java8或Java时不应使用的类
更高
这适用于尾随Z
的输入,如下所示:
在模式中,T
在两侧用“
转义
末尾的Z
模式实际上是XXX
,如文件所述
在SimpleDateFormat
的JavaDoc中,它不是很清楚
实际上如何使用它,因为Z
是旧的标记
时区
信息
tl;博士
使用java.time.Instant
类以标准ISO 8601格式解析文本,以UTC表示一个时刻
Instant.parse( "2010-10-02T12:23:23Z" )
ISO 8601
该格式由日期时间字符串格式的标准定义
两者:
- 内置于Java 8及更高版本()
- 图书馆
java.util.Date date = java.util.Date.from( instant ); // Pass an `Instant` to the `from` method.
时区
如果需要,可以指定时区
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
皈依
java.util.Date date = java.util.Date.from( zdt.toInstant() ); // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.
乔达时间
更新:Joda Time项目现在处于维护模式。团队建议迁移到java.time类
下面是Joda Time 2.8中的一些示例代码
org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC ); // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.
转换到旧类。请注意,由于j.u.Date无法指定时区,因此指定的时区在转换过程中丢失
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
时区
如果需要,可以指定时区
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
<太长了,读不下去了,(java),现在有两个答案,它们都是长的(TL;DR太短,IHO),所以我从我的经验开始写总结,开始使用新的库(适用于Java 8版本的其他答案)。设置标准的写日期方式:<代码> YYY-MMDD< /COD> >所以日期时间的格式仅为如下(毫秒可以是0、3、6或9位),不需要格式化字符串:
我不需要它,但由于获得年份是问题的代码,因此:import java.time.Instant; public static void main(String[] args) { String date="2010-10-02T12:23:23Z"; try { Instant myDate = Instant.parse(date); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
更为棘手的是,不能直接从
完成,可以通过即时
以提问的方式完成,但IMHO由于格式固定,子字符串更易于使用:日历
myDate.toString().substring(0,4);
你知道这个“T”是什么意思吗?我认为整个日期连同“T”都应该转换成日期(没有跳过“单引号”,但我们缺少的是解析模式。
代表时间,是国际日期-时间格式标准的一部分。这很奇怪。将T
用单引号括起来对我来说很有效(至少在解决解析错误方面)@AalapPatel请注意,Joda Time项目现在处于维护模式。团队建议迁移到java.Time类。这两项工作由同一个人Stephen Colebourne领导。谢谢,我使用它从服务器获取毫秒,返回UTC时间和/或区域设置时间,在这种情况下对我来说效果很好。Instant.parse需要最小api级别26 INandroid@NaveedAhmad请参阅答案底部关于Three Ten Backport和Three TenABP项目的项目符号。T