【问题标题】:How to convert string to date object?如何将字符串转换为日期对象?
【发布时间】:2011-08-24 14:19:23
【问题描述】:
String date="2006-06-21T15:57:24.000Z";

如何在不更改 Android 格式的情况下将此字符串转换为 Date 对象?

【问题讨论】:

  • A Date 没有具有格式。如果您希望以某种方式对其进行格式化,请使用 DateFormat 对象。顺便说一句,这也是String解析Date对象的方法。
  • SimpleDateFormat 是您在 Java 中所需要的。不确定Android。
  • 如果不更改格式,您将无法做到这一点。也许您正在简单地打印一个java.util.Date 对象,而这只会导致显示Date#toString()? (确实有不同的固定格式)。然后,您应该首先将 Date 转换为 String 以便以所需的格式显示给人类。

标签: java android date


【解决方案1】:

这里有简单的代码:

  private Date parseDate(String date) {
    SimpleDateFormat curFormater = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.S'Z'");
    Date dateObj = new Date();
    try {
      dateObj = curFormater.parse(date);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    return dateObj;
  }

【讨论】:

  • 它产生这样的结果:Wed Jun 21 15:57:24 GMT+00:00 2006 但我需要 2006-06-21T15:57:24.000Z
  • 它也产生相同的输出 Mon Oct 07 04:50:00 PDT 1996
【解决方案2】:

使用 Time 类并解析字符串。然后使用 Time toMillis() 函数并实例化一个 Date。

http://developer.android.com/reference/android/text/format/Time.html#parse3339(java.lang.String)

【讨论】:

  • 但我需要为 2006-06-21T15:57:24.000Z 编码
  • 来自文档。 Time:该类在 API 级别 22 中已弃用。请改用 GregorianCalendar。 查看my answer
【解决方案3】:

参见 SimpleDateFormat,http://developer.android.com/reference/java/text/SimpleDateFormat.html

这个类使用给定的模式将字符串转换为日期,反之亦然。

一旦您创建了具有正确模式的 SimpleDateFormat,您就可以使用它将字符串转换为日期,根据需要使用日期,并最终使用相同的 SimpleDateFormat 实例将日期转换回字符串。

编辑:时区说明

在问题中未指定给定字符串是否为“纯”ISO 8601 日期,在这种情况下,您是否需要支持多个时区,如果该时区将仅表示为数字(+0200如在 RFC 822 中),带有冒号的数字(ISO 8601 允许的 +02:00)或名称(EST 等...)。

如果字符串是纯 ISO 8601 字符串,那么 SimpleDateFormat 在解码时区时会出现一些问题。但是,如果它是“始终为 Z”(意味着时区数据没有意义,您可以放心地忽略它),或者使用不带冒号的数字(如 +0200 等),或者使用时区名称,那么 SimpleDateFormat 可以正确处理它.

【讨论】:

  • @jarnbjo,SimpleDateFormat 支持任何可访问的日期格式:)
  • umbr:否。SimpleDateFormat 支持根据 RFC822 而不是 ISO8601 的时区组件。
【解决方案4】:

我来到这里是因为这应该是Covert RFC3339 DateTime to Date in java 的回答问题。但是,Time 是自 API 级别 22 以来 Android 中已弃用的类。

简单的答案基于this one

import com.google.api.client.util.DateTime;

Date date = new Date(new DateTime("2006-06-21T15:57:24.000Z").getValue());

【讨论】:

    【解决方案5】:

    tl;博士

    如何将此字符串转换为日期对象

    Datejava.time.Instant 取代。

    Instant.parse( "2006-06-21T15:57:24.000Z" )
    

    不改变这种格式

    日期时间对象没有“格式”。只有文本有格式。

    String output = instant.toString() ;  // Generate text in a `String` object in standard ISO 8601 format that represents the value of the `Instant` date-time object.
    

    ISO 8601

    输入字符串恰好是标准ISO 8601 格式。末尾的ZZulu 的缩写,意思是UTC

    java.time

    在解析和生成表示日期时间值的字符串时,java.time 类默认使用 ISO 8601 格式。

    Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。

    Instant instant = Instant.parse( "2006-06-21T15:57:24.000Z" );
    

    要生成标准 ISO 8601 格式的字符串,请调用 toString

    String output = instant.toString(); 
    

    2006-06-21T15:57:24Z

    字符串 != 日期时间

    不要将日期时间对象与表示值的字符串混为一谈。日期时间对象可以解析String,可以生成String,但不是String。换句话说,可以输入和/或输出字符串,但它不是日期时间对象本身。

    所以您的问题“如何在不更改此格式的情况下将此字符串转换为日期对象”是没有意义的。

    要生成非 ISO 8601 格式的字符串,请将您的 Instant 转换为 OffsetDateTimeZonedDateTime 对象,并使用 DateTimeFormatter 类。在 Stack Overflow 中搜索 DateTimeFormatter 以查看更多讨论和许多示例。

    转化

    您应该尽可能避免使用旧的 java.util.Date 类。但是,如果您必须与尚未更新为 java.time 类型的旧代码交互,您可以通过添加到旧日期时间类的新方法与 java.time 进行转换。

    java.util.Date utilDate = java.util.Date.from( instant );
    

    ……然后朝着另一个方向……

    Instant instant = utilDate.toInstant();
    

    关于java.time

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

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

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

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

    从哪里获得 java.time 类?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2020-11-30
    • 2022-01-11
    • 1970-01-01
    • 2022-07-20
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多