Java中的字符串到日期

时间:2012-11-20 06:48:59

标签: java parsing date

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果你正在使用Java 7,你应该没有任何字符串按摩,使用UTC偏移的新X说明符:

SimpleDateTime format = new SimpleDateTime("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好很多......)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

在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);
}

答案 5 :(得分:0)

java.time

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

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

<块引用>

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

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

现代日期时间 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 了解有关现代 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