【问题标题】:Android parsing String to Date time with SimpleDateFormatAndroid 使用 SimpleDateFormat 将字符串解析为日期时间
【发布时间】:2013-11-21 08:05:14
【问题描述】:

我有字符串11/08/2013 08:48:10

我使用SimpleDateFormat("MM/dd/yyyy HH:mm:ss")

在解析时会抛出异常:无法解析的日期

这有什么问题?

            String result = han.ExecuteUrl("http://"+han.IP+":8015/api/Values/GetLastChange"); 
            Log.d("Dal","result date time "+result); #result is 11/08/2013 08:48:10
            SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

            Date convertedDate = new Date();
            try
            {

                convertedDate = dateFormat.parse(result);
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }

【问题讨论】:

  • 完成。 han 变量仅用于从返回日期的 url 获取结果
  • 对于新读者来说,考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 我无法复制。您的代码在我的桌面 Java 上运行良好。我得到了Fri Nov 08 08:48:10 CET 2013

标签: java android date time


【解决方案1】:

它的工作尝试像这样解析你的日期..

String dtStart = "11/08/2013 08:48:10";
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
try {
    date = format.parse(dtStart);
    System.out.println("Date ->" + date);
} catch (ParseException e) {
    e.printStackTrace();
}

【讨论】:

  • 你的答案和问题的区别在哪里?
【解决方案2】:

工作代码在这里。

您可以使用以下代码将字符串转换为日期

String myStrDate = "11/08/2013 08:48:10";
    SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    try {
        Date date = format.parse(myStrDate);
        System.out.println(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

对于反向,这意味着,从日期转换为字符串

SimpleDateFormat myFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    try {
        Date date = new Date();
        String datetime = myFormat.format(date);
        System.out.println("Current Date Time in give format: " + datetime);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

有关日期和时间格式的更多参考。访问developer site

【讨论】:

    【解决方案3】:

    java.time 和 ThreeTenABP

    这不是您要求的答案,但应该是其他读者在 2020 年及以后想要的答案。

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm:ss");
        String result = "11/08/2013 08:48:10"; 
        LocalDateTime dateTime = LocalDateTime.parse(result, formatter);
        System.out.println("Parsed date and time: " + dateTime);
    

    这个 sn-p 的输出是:

    解析日期和时间:2013-11-08T08:48:10

    您使用的 Date 类设计不佳且已过时,因此请不要再使用它。相反,我使用的是现代 Java 日期和时间 API java.time。如果您需要 Date 来获取您现在无法升级的旧版 API,则转换为:

        Instant i = dateTime.atZone(ZoneId.systemDefault()).toInstant();
        Date oldfashionedDate = DateTimeUtils.toDate(i);
    
        System.out.println("Converted to old-fashioned Date: " + oldfashionedDate);
    

    转换为老式日期:2013 年 11 月 8 日星期五 08:48:10 CET

    你的代码出了什么问题?

    这是怎么回事?

    您的代码唯一的问题是您使用了臭名昭著的麻烦 SimpleDateFOrmat 和设计不佳的 Date 类。你在 2013 年问这个问题时没有错。java.time 直到 4 个月后才出来。

    您的代码运行良好。有人可能会推测字符串中的前导空格等阻止了解析。如果这是问题所在,请尝试解析 result.trim() 而不仅仅是 result,因为 trim() 返回一个删除了前导和尾随空格的字符串。

    问题:java.time 不需要 Android API 26 级吗?

    java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

    • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。只有在这种情况下,转换为Date 会更简单一些:Date.from(i)
    • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
    • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多