我必须解析以下日期
Fri Sep 30 18:31:00 GMT + 04:00 2016
并且它无法使用以下模式:
new SimpleDateFormat("EEE MMM dd HH:mm:ss z YYYY", Locale.ENGLISH);
你能告诉我我做错了什么吗?
答案 0 :(得分:3)
它应该是小写“y”:
EEE MMM dd HH:mm:ss z yyyy
大写字母“Y”表示weekBasedYear:
可以从基于周的年份,周和年份创建日期 某一天的周
我想混合基于周的模式和绝对模式或时代模式对于解析来说效果不佳。
答案 1 :(得分:2)
OffsetDateTime
.parse
(
"Fri Sep 30 18:31:00 GMT+04:00 2016" ,
DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss O uuuu" , Locale.US )
)
.toString()
<块引用>
2016-09-30T18:31+04:00
其他答案现在已经过时了。可怕的 Date
、Calendar
和 SimpleDateFormat
类现在是遗留的,多年前被 JSR 310 中定义的现代 java.time 类取代。
您的输入字符串表示在 UTC 偏移量上下文中带有时间的日期。偏移量是比 UTC 的基线提前或滞后几个小时。对于此类信息,请使用 OffsetDateTime
类。
请注意,UTC 偏移量不是时区。时区是特定地区人民过去、现在和未来使用的偏移量变化的历史记录。
DateTimeFormatter
类替换了 SimpleDateFormat
。格式代码相似,但不完全相同。所以仔细研究Javadoc。
请注意,我们传递了一个 Locale
。这指定了用于解析输入的人类语言和文化规范,例如月份名称、星期几名称、标点符号、大小写等。
package work.basil.example.datetime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Parsing
{
public static void main ( String[] args )
{
Parsing app = new Parsing();
app.demo();
}
private void demo ( )
{
String input = "Fri Sep 30 18:31:00 GMT+04:00 2016";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss O uuuu" , Locale.US );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
System.out.println( "odt = " + odt );
}
}
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
要了解更多信息,请参阅 Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为 JSR 310。
现在位于 Joda-Time 的 maintenance mode 项目建议迁移到 java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合 JDBC driver 或更高版本的 JDBC 4.2。不需要字符串,不需要 java.sql.*
类。 Hibernate 5 和 JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
答案 2 :(得分:0)
下面的代码工作正常
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class ParseDate {
public static void main(String[] args) {
try {
SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
Date date = parserSDF.parse("Fri Sep 30 18:31:00 GMT+04:00 2016");
System.out.println("date: " + date.toString());
} catch (ParseException ex) {
ex.printStackTrace();
}
}
}