将String转换为java.util.Date

时间:2011-11-16 11:41:00

标签: java date

我有一个字符串

strikedate="2011-11-19T00:00:00.000-05:00"

我需要把它放到java.util.Date中 有人可以告诉我如何将这个字符串转换为日期

5 个答案:

答案 0 :(得分:15)

当然 - 使用SimpleDateFormat

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
Date parsed = sdf.parse(text);
编辑:Eek - 由于您的时区格式,它并不那么简单。以上将使用而不用冒号。您可能需要使用Joda Time来解析带有冒号的版本。现在检查......

编辑:是的,使用Joda Time,您可以使用:

DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
DateTime parsed = formatter.parseDateTime(text);
// If you really need it
Date date = parsed.toDate();

Joda Time也是一个更好的日期/时间API - 如果可以的话,我强烈建议您使用它。

答案 1 :(得分:2)

使用SimpleDateFormat(即其继承的parse()方法)。 格式字符串应该是“YYYY-MM-dd'T'HH:mm:ss.SSSZ” - 虽然这可以预测zimezone没有冒号,所以你可能需要预处理字符串以删除冒号。

答案 2 :(得分:1)

Google关于“SimpleDateFormat”

答案 3 :(得分:0)

尝试类似:

String format = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
offset = "GMT-04:00";
String date = "2010-10-12T20:01:18.000Z";

SimpleDateFormat sdf = new SimpleDateFormat(format);
str = sdf.parse(date);

答案 4 :(得分: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("2011-11-19T00:00:00.000-05:00");
        System.out.println(odt);
    }
}

输出:

2011-11-19T00:00-05:00

ONLINE DEMO

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

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

检查 this answerthis answer 以了解如何将现代 Date-Time API 与 JDBC 结合使用。

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。

使用旧 API 的解决方案:

为了完整起见,下面给出了使用 SimpleDateFormat 的解决方案:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
        Date date = sdf.parse("2011-11-19T00:00:00.000-05:00");

        // Display date in UTC/GMT
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        System.out.println(sdf.format(date));

        // Display date in the timezone with an offset of -05:00 hours
        sdf.setTimeZone(TimeZone.getTimeZone("GMT-05:00"));
        System.out.println(sdf.format(date));
    }
}

输出:

2011-11-19T05:00:00.000Z
2011-11-19T00:00:00.000-05:00

ONLINE DEMO

请注意,java.util.Date 对象不包含任何格式和时区信息,它应用格式、EEE MMM dd HH:mm:ss z yyyy 和 JVM 的时区来返回从该毫秒值派生的 Date#toString 值.要以不同的格式和时区获取 String 对象的 java.util.Date 表示,您需要使用具有所需格式和适用时区的 SimpleDateFormat


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