将字符串转换为java.util.Date

3

我有一个字符串,如下:

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

我需要将这个字符串转换为java.util.Date类型。 请问有谁能告诉我如何将这个字符串转换为日期类型?

4个回答

16
当然可以 - 使用 SimpleDateFormat
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
Date parsed = sdf.parse(text);

编辑:哎呀,由于您的时区格式,情况并不那么简单。上面的代码可以在没有冒号的情况下工作。使用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,如果可以的话,我强烈建议您使用它。


String dateStr = "2013-06-25T16:09:41.276-05:00"; Matcher m = Pattern.compile("(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}-)(\\d{2}:\\d{2})").matcher(dateStr); if (m.matches()) { dateStr = m.group(1) + m.group(2).replace(":", ""); } Date date = new SimpleDateFormat("yyyy-M-d'T'HH:mm:ss.SSSZ").parse(dateStr); System.out.printf("日期 = '%s'", date); - starryknight64

2

使用SimpleDateFormat(即其继承的parse()方法)。

格式字符串应为“YYYY-MM-dd'T'HH:mm:ss.SSSZ”,但这需要去掉冒号,因此您可能需要预处理字符串以删除冒号。


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

0

java.time

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

此外,以下是在Joda-Time首页上发布的通知:

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

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

现代日期时间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

在线演示

如果出于任何原因,您需要将OffsetDateTime对象转换为java.util.Date对象,则可以按以下方式进行操作:

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

查看此答案此答案,了解如何使用JDBC的现代日期时间API。

Trail: 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

在线演示

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


* 如果由于任何原因,您必须坚持使用Java 6或Java 7,则可以使用{{link1:ThreeTen-Backport}}将大多数java.time功能回溯到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍不符合Java-8,请检查{{link2:通过去糖化可用的Java 8+ API}}和{{link3:如何在Android项目中使用ThreeTenABP}}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接