如何解析日期?

我正在尝试使用SimpleDateFormat来解析此日期,但它不起作用:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Formaterclass {
public static void main(String[] args) throws ParseException{
String strDate = "Thu Jun 18 20:56:02 EDT 2009";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date dateStr = formatter.parse(strDate);
String formattedDate = formatter.format(dateStr);
System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
Date date1 = formatter.parse(formattedDate);


formatter = new SimpleDateFormat("dd-MMM-yyyy");
formattedDate = formatter.format(date1);
System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
}
}

如果我用strdate="2008-10-14"来尝试这段代码,我会得到一个肯定的答案。有什么问题吗?如何解析此格式?

PS.我从jDatePicker中获取此日期,但没有说明在用户选择日期时如何修改获取的日期格式。

459879 次浏览

问题是您的日期格式如下:

Thu Jun 18 20:56:02 EDT 2009

但使用SimpleDateFormat,即:

yyyy-MM-dd

这两种格式不一致。您需要构造一个SimpleDateFormat,它与您试图解析为日期的字符串的布局相匹配。为了便于查看,您需要一个SimpleDateFormat,如下所示:

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

检查我链接的Javadoc页面,看看这些字符是如何使用的。

您不能期望使用以不同格式设置的SimpleDateFormat来解析日期。

要解析“ Thu Jun 1820:56:02 EDT 2009 ”日期字符串,您需要如下的SimpleDateFormat(大致):

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

使用它将字符串解析为日期,然后使用另一个SimpleDateFormat将该日期转换为所需的格式。

        String input = "Thu Jun 18 20:56:02 EDT 2009";
SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Date date = parser.parse(input);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(date);


...

Javadoc:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

获取选定日期怎么样?总之,特别是在你的代码问题上,问题出在这一行:

new SimpleDateFormat("yyyy-MM-dd");

构造函数中的字符串必须与日期的格式匹配。有关如何执行此操作的文档在这里中。看起来你需要一些接近“ eee mmm d HH:mm:SS zzz yyyy ”的东西

我们现在有一种更现代的方法来做这项工作。

Java.time

Java.time框架与Java 8及更高版本捆绑在一起。请参阅教程。这些新类受到乔达时间的启发,由JSR 310定义,并由三十号外项目扩展。它们是对麻烦的旧类Java.util.Date/.Calendar等的巨大改进。

注意,像EDT这样的3-4个字母的代码既不是标准化的,也不是唯一的。尽可能避开他们。学习使用ISO 8601标准标准格式。Java.time框架可能会尝试进行翻译,但许多常用代码都有重复的值。

顺便说一下,请注意Java.time在默认情况下是如何使用ISO 8601格式生成字符串的,但通过在括号中附加时区名称进行了扩展。

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

转储到控制台。

System.out.println ( "zdt : " + zdt );

运行时。

中兴通讯:2009-06-18T20:56:02-04:00[美洲/纽约_]

调整时区

为了好玩,让我们调整到印度时区。

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

ZDT加尔各答:2009-06-19T06:26:02+05:30[亚洲/加尔各答]

转换为J.U.日期

如果您确实需要将Java.util.Date对象用于尚未更新为Java.time类型的类,请转换。请注意,您将丢失指定的时区,但相同的时刻会自动调整为协调世界时

java.util.Date date = java.util.Date.from( zdt.toInstant() );

回应: “如何将2016年9月13日星期二00:00:00 GMT-0500(Hora de Verano Central(墨西哥))转换为爪哇DD-MM-YY? ”,它是如何被标记重复的?

试试这个: 使用java.util.Datejava.text.SimpleDateFormat,这是一个简单的解决方案。

public static void main(String[] args) throws ParseException {


String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
Date f = new Date(fecha);


SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
fecha = sdf.format(f);
System.out.println(fecha);
}