我有一个字符串
strikedate="2011-11-19T00:00:00.000-05:00"
我需要把它放到java.util.Date中 有人可以告诉我如何将这个字符串转换为日期
答案 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.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
出于任何原因,如果您需要将 OffsetDateTime
的这个对象转换为 java.util.Date
的对象,您可以这样做:
Date date = Date.from(odt.toInstant());
检查 this answer 和 this answer 以了解如何将现代 Date-Time API 与 JDBC 结合使用。
从 Trail: Date Time 了解有关现代 Date-Time 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
值.要以不同的格式和时区获取 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 desugaring 和 How to use ThreeTenABP in Android Project。