我有一个字符串,如下:
strikedate="2011-11-19T00:00:00.000-05:00"
我需要将这个字符串转换为java.util.Date类型。 请问有谁能告诉我如何将这个字符串转换为日期类型?
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,如果可以的话,我强烈建议您使用它。
使用SimpleDateFormat(即其继承的parse()
方法)。
格式字符串应为“YYYY-MM-dd'T'HH:mm:ss.SSSZ”,但这需要去掉冒号,因此您可能需要预处理字符串以删除冒号。
尝试类似这样的内容:
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);
java.util
的日期时间API及其格式化APISimpleDateFormat
已经过时且容易出错。建议完全停止使用它们并切换到现代日期时间API*。
此外,以下是在Joda-Time首页上发布的通知:
请注意,从Java SE 8开始,用户被要求迁移到java.time(JSR-310)- JDK的核心部分,取代了该项目。
java.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的内容。
为了完整起见,以下是使用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}}。
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