【问题标题】:Parse a date-time string in ISO 8601 format without offset-from-UTC解析 ISO 8601 格式的日期时间字符串,而无需从 UTC 偏移
【发布时间】:2016-06-06 04:51:10
【问题描述】:

我正在将字符串类型的日期解析为日期格式,但每次都得到这个异常

java.text.ParseException: Unparseable date: "2016-05-21T00:00:00" (at offset 4)

我的代码是:

   String d = "2016-05-21T00:00:00";
    DateFormat df = new SimpleDateFormat("yyyy MM dd HH:mm:ss", Locale.ENGLISH);
    Date myDate = null;
    try {
        myDate = df.parse(d);
    } catch (ParseException e) {
        e.printStackTrace();
    }

【问题讨论】:

  • 检查link
  • 您用来解析的SimpleDateFormat 不理解您的输入字符串 - 格式不匹配。只需修复它,以便您的解析器匹配输入格式。请注意,您的输入字符串格式几乎是ISO-8601 格式
  • 我想知道...为什么它几乎是一样的?可以更改输入以使其 相同吗? 几乎使用标准没有任何价值...

标签: android date


【解决方案1】:

您的日期字符串和 DateFormat 需要匹配。对于您的输入"2016-05-21T00:00:00",正确的 DateFormat 是:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

【讨论】:

    【解决方案2】:

    tl;博士

    LocalDateTime.parse( "2016-05-21T00:00:00" )
    

    ISO 8601

    输入字符串2016-05-21T00:00:00 是标准ISO 8601 格式。

    java.time

    Java 8 及更高版本中内置的java.time 类在解析或生成日期时间值的文本表示时默认使用ISO 8601 格式。

    输入字符串缺少任何offset-from-UTCtime zone 信息。所以字符串本身是不精确的,没有特定的含义,因为它不是时间轴上的时刻。这些值在 java.time 中由 LocalDateTime 类表示。

    String input = "2016-05-21T00:00:00";
    LocalDateTime ldt = LocalDateTime.parse( input );
    

    如果您从更大的上下文中知道该字符串旨在对某个与 UTC 的偏移量有意义,请分配一个 ZoneOffset 以获取一个 OffsetDateTime 对象。

    ZoneOffset zoneOffset = ZoneOffset.of( 5 , 30 );
    OffsetDateTime odt = ldt.atOffset( zoneOffet );
    

    更好的是,如果您确定预期的时区,请指定 ZoneId 以获取 ZonedDateTime

    ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
    ZonedDateTime zdt = ldt.atZone( ZoneId );
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    使用符合JDBC 4.2 或更高版本的JDBC driver,您可以直接与您的数据库交换java.time 对象。不需要字符串也不需要 java.sql.* 类。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      【解决方案3】:
      String expectedDateFormat=getDateFromString("2016-05-21 00:00:00","yyyy-MM-dd HH:mm:ss","yyyy MM dd HH:mm:ss");
      

      此方法会将实际格式执行为预期格式。

      public static String getDateFromString(String dateInString, String actualformat, String exceptedFormat) {
              SimpleDateFormat form = new SimpleDateFormat(actualformat);
      
              String formatedDate = null;
              Date date;
              try {
                  date = form.parse(dateInString);
                  SimpleDateFormat postFormater = new SimpleDateFormat(exceptedFormat);
                  formatedDate = postFormater.format(date);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return formatedDate;
          }
      

      【讨论】:

        【解决方案4】:
        public  class test {
        
            public static void main(String [] args) {
        
                // ref http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
                   SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
                  System.out.println("Current Date: " + simpleDateFormat.format(new Date()));
            }
        
        }
        

        有关SimpleDateFormat的更多信息

        【讨论】:

          【解决方案5】:

          试试这个方法

          String d = "2016-05-21 00:00:00";
              DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
              Date myDate = null;
              try {
                  myDate = df.parse(d);
              } catch (ParseException e) {
                  e.printStackTrace();
              }
          

          编辑

          String d = "2016-05-21 00:00:00";
              DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
              Date myDate = null;
              try {
                  myDate = df.parse(d);
              } catch (ParseException e) {
                  e.printStackTrace();
              }
          

          【讨论】:

          • java.text.ParseException:无法解析的日期:“2016-05-21 00:00:00”(偏移量 4)
          • @Touchstone 开发者你的 targetSdk 是什么?
          • targetSdkVersion 23
          • @Touchstone 开发者对 23 进行了一些更改,签出this
          • @Touchstonedeveloper:请参阅我的编辑帖子,它肯定会起作用
          猜你喜欢
          • 2021-01-17
          • 2017-09-07
          • 1970-01-01
          • 2020-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多