2

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

4

6 回答 6

2

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

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

于 2012-11-20T06:50:56.030 回答
1

您应该为此使用 DateFormat 类:

首先,您需要在时区部分摆脱它: ,并使您的日期字符串像这样

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

并使用下面的代码片段:

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 不太了解

于 2012-11-20T06:52:50.260 回答
1

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

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...要好得多)

于 2012-11-20T07:00:29.533 回答
0

使用乔达时间。它功能强大且易于使用。

于 2012-11-20T06:49:54.333 回答
0

在 Java 7 之前,您无法使用标准 JDK Date 在时区中解析带有冒号的日期。在 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);
}
于 2012-11-20T06:57:06.747 回答
0

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

另外,下面引用的是来自Joda-Time主页的通知:

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

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

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

演示:

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 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-07-09T17:50:04.390 回答