【问题标题】:String to Date in JavaJava中的字符串到日期
【发布时间】:2012-11-20 06:48:59
【问题描述】:

我有这样的日期字符串“2010-12-10T20:03:53-06:00” 我想将其转换为 Java 中的等效日期对象。 任何想法如何做到这一点?

【问题讨论】:

    标签: java parsing date


    【解决方案1】:

    您正在寻找的是 SimpleDateFormat.parse()。它将字符串转换为 Date 对象。

    http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

    【讨论】:

    • Java 1.4.2(您指向的)将无法解析带有冒号的 -06:00 - Java 7+ 将。
    • 有趣。我没有意识到这一点。
    【解决方案2】:

    如果您使用的是 Java 7,您应该可以不用任何字符串按摩,使用新的 X 说明符作为 UTC 偏移量:

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.US);
    Date date = format.parse(text);
    

    (测试以确保 - 当我自己安装 JDK 7 时:)

    不过,总的来说,我强烈建议使用Joda Time 进行日期处理。它的Z 说明符可以处理带有冒号的偏移量:

    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ")
                                                .withLocale(Locale.US);
    DateTime dateTime = formatter.parseDateTime(text);
    

    事实上,有一个ISODateTimeFormat 类可以让这更简单:

    DateTimeFormatter formatter = ISODateTimeFormat.dateTimeNoMillis();
    

    Joda Time 是一个明显比内置 API 更好的日期/时间 API。 (它远非完美,但比DateCalendar 好很多...)

    【讨论】:

    • 这里还需要其他帮助...如何将日期对象转换回这种格式?
    • @Avidev9:调用format 而不是parse。不过,这将从SimpleDateTime 获取时区,因此您应该考虑将其设置为什么。
    【解决方案3】:

    您应该为此使用 DateFormat 类:

    首先你需要去掉时区部分中的:,并让你的日期字符串像这样

    2010-12-10T20:03:53-0600
    

    并使用下面的代码sn-p:

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");    
    Date d = formatter.parse("2010-12-10T20:03:53-0600");
    

    注意:我在 Java 6 上检查了这个,Skeet 先生提到了一个更好的解决 Java 7 的答案,因为我对 Java 7 不太了解

    【讨论】:

      【解决方案4】:

      使用Joda time。它功能强大且易于使用。

      【讨论】:

        【解决方案5】:

        java.time

        java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

        另外,下面引用的是来自home page of Joda-Time的通知:

        请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

        使用现代日期时间 API java.time 的解决方案:

        现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。

        演示:

        import java.time.OffsetDateTime;
        
        public class Main {
            public static void main(String[] args) {
                OffsetDateTime odt = OffsetDateTime.parse("2010-12-10T20:03:53-06:00");
                System.out.println(odt);
            }
        }
        

        输出:

        2010-12-10T20:03:53-06:00
        

        ONLINE DEMO

        出于任何原因,如果您需要将此OffsetDateTime 的对象转换为java.util.Date 的对象,您可以这样做:

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

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


        * 出于任何原因,如果您必须坚持使用 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

        【讨论】:

          【解决方案6】:

          在 Java 7 之前,您无法使用标准 JDK 日期在时区中解析带有冒号的日期。在 Java 7 之前,时区必须是带有名称的完整时区或格式为 -0600

          您有 3 个选项:

          这是第二个选项的示例:

          public static void main(String[] args) throws ParseException {
              String input = "2010-12-10T20:03:53-06:00";
              int colon = input.lastIndexOf(":");
              input = input.substring(0, colon) + input.substring(colon + 1, input.length());
              System.out.println(input);
              DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
              Date date = fmt.parse(input);
              System.out.println("date = " + date);
          }
          

          【讨论】:

          • 嗨 assylias - 请将 YYYY 更改为 yyyyY 指定 Week year
          猜你喜欢
          • 1970-01-01
          • 2012-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多