【问题标题】:Java String to Date, ParseExceptionJava 字符串到日期,ParseException
【发布时间】:2011-08-12 20:25:33
【问题描述】:

我有一个名为DateCompareOld, it has the value "Fri Aug 12 16:08:41 EDT 2011" 的字符串。我想将其转换为日期对象。

 SimpleDateFormat dateType =  new SimpleDateFormat("E M dd H:m:s z yyyy");
 Date convertDate = dateType.parse(DateCompareOld);

但是每次我尝试这个,我都会得到一个解析异常。我尝试过其他 SimpleDateFormat 格式标准,但总是失败。

建议?

【问题讨论】:

标签: java object date simpledateformat


【解决方案1】:

试试这个格式:

EEE MMM dd HH:mm:ss zzz yyyy

快速测试:

public static void main(String[] args) throws Exception {
    DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    System.out.println(df.parse("Fri Aug 12 16:08:41 EDT 2011"));
}

// outputs
Fri Aug 12 15:08:41 CDT 2011

输出在 CDT 中,因为这是我所在的位置,但值是正确的。

【讨论】:

    【解决方案2】:
    DateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    dateType.setLenient(false);
    Date convertDate = dateType.parse(DateCompareOld);
    

    【讨论】:

      【解决方案3】:

      java.time

      旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

      另一个需要注意的重要事情是你的字符串有English 文本,因此你必须使用Locale.ENGLISH,这样当你的代码在Locale 是不是English。无论如何,千万不要在没有Locale 的情况下使用日期时间解析/格式化类型(例如SimpleDateFormatDateTimeFormatter 等),因为这些类型是Locale 敏感的。

      使用现代日期时间 API 的演示:

      import java.time.ZonedDateTime;
      import java.time.format.DateTimeFormatter;
      import java.util.Locale;
      
      public class Main {
          public static void main(String args[]) {
              String strDateTime = "Fri Aug 12 16:08:41 EDT 2011";
              DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d H:m:s z u", Locale.ENGLISH);
              ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
              System.out.println(zdt);
          }
      }
      

      输出:

      2011-08-12T16:08:41-04:00[America/New_York]
      

      如果你需要一个java.util.Date 对象,你可以通过如下方式获得它:

      Date date = Date.from(zdt.toInstant());
      

      Trail: Date Time 了解有关现代日期时间 API 的更多信息。

      使用旧版 API:

      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Locale;
      
      public class Main {
          public static void main(String args[]) throws ParseException {
              String strDateTime = "Fri Aug 12 16:08:41 EDT 2011";
              SimpleDateFormat sdf = new SimpleDateFormat("E MMM d H:m:s z y", Locale.ENGLISH);
              Date date = sdf.parse(strDateTime);
              // ...
          }
      }
      

      注意java.util.Date 对象不是像modern date-time types 那样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即January 1, 1970, 00:00:00 GMT(或 UTC)。当你打印一个java.util.Date 的对象时,它的toString 方法返回JVM 时区中的日期时间,根据这个毫秒值计算得出。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat 并从中获取格式化字符串。


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        【解决方案4】:

        注意传递给 SimpleDateFormat() 的字符串应更正为“EEE MMM dd HH:mm:ss z yyyy”

        代码如下:

        import java.util.Date;
        import java.text.SimpleDateFormat;
        import java.text.ParseException;
        public class DateTest{
        public static void main(String []args){
            String DateCompareOld = "Fri Aug 12 16:08:41 EDT 2011";
            SimpleDateFormat dateType =  new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
            Date convertDate = new Date();
            try{
             convertDate = dateType.parse(DateCompareOld);
            }catch(ParseException pex){
                pex.printStackTrace();
            }
            System.out.println(convertDate.toString());
          }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-15
          • 1970-01-01
          • 2013-07-09
          • 1970-01-01
          • 1970-01-01
          • 2012-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多