这个问题在这里已有答案:
我要解析的字符串:
太阳11月10日10:00:00 CET 2013
我的代码:
substrings = "Sun Nov 10 10:00:00 CET 2013"
SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM d HH:mm:ss ZZZ yyyy");
Date date = parserSDF.parse(substrings);
编译错误输出:
java.text.ParseException:Unparseable date:“Sun Nov 10 10:00:00 CET 2013”at java.text.DateFormat.parse(Unknown Source)...
可能你错过了正确的Locale。在您的示例中尝试这样做:
SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM d HH:mm:ss ZZZ yyyy", Locale.US);
ZZZ将尝试根据RFC 822时区格式化时区,改为使用zzz。
现代方法使用java.time类。
String input = "Sun Nov 10 10:00:00 CET 2013";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString():2013-11-10T10:00 + 01:00 [欧洲/巴黎]
几年前,java.util.Date
班取代了可怕的老java.time.Instant
班。两者都代表UTC时刻。要从上面的时区调整到UTC,只需提取一个Instant
对象。
Instant instant = zdt.toInstant() ; // Adjust from time zone to UTC.
避免使用java.util.Date
。但是,如果必须与尚未更新到java.time的旧代码进行互操作,则可以来回转换。查看添加到旧类的新方法,例如Date.from
和Date::toInstant
方法。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
现在在Joda-Time的maintenance mode项目建议迁移到java.time班。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。
您可以直接与数据库交换java.time对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
问题是parserSDF采用字符串而不是数组和ParsePosition。我写这个是为了输出我想你想要的东西。
import java.text.*;
public class Parser{
public static void main(String[] args){
String input = "Sun Nov 10 10:00:00 CET 2013";
SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM d HH:mm:ss ZZZ yyyy");
System.out.println(parserSDF.parse(input, new ParsePosition(0)));
}
}
我建议在API中查看SimpleDateFormat和ParsePosition