Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非法模式字符';T';将日期字符串解析为java.util.date时_Java_Date_Simpledateformat_Iso8601 - Fatal编程技术网

非法模式字符';T';将日期字符串解析为java.util.date时

非法模式字符';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

我有一个日期字符串,我想使用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=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及更高版本()
  • 图书馆
…默认情况下,解析和生成字符串时使用ISO 8601格式

通常应避免使用旧的java.util.Date/.Calendar&java.text.SimpleDateFormat类,因为它们是出了名的麻烦、混乱和缺陷类。如果需要进行互操作,可以来回转换

java.time 新框架内置于Java8和更高版本中。受项目启发、定义和扩展

转换到旧类

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
      代表时间,是国际日期-时间格式标准的一部分。这很奇怪。将
      T
      用单引号括起来对我来说很有效(至少在解决解析错误方面)@AalapPatel请注意,Joda Time项目现在处于维护模式。团队建议迁移到java.Time类。这两项工作由同一个人Stephen Colebourne领导。谢谢,我使用它从服务器获取毫秒,返回UTC时间和/或区域设置时间,在这种情况下对我来说效果很好。Instant.parse需要最小api级别26 INandroid@NaveedAhmad请参阅答案底部关于Three Ten Backport和Three TenABP项目的项目符号。