如何解析日期?

时间:2009-06-16 01:01:39

标签: java date simpledateformat

我正在尝试使用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得到了这个日期,并且没有关于如何修改用户选择日期时获得的日期格式的说明。

5 个答案:

答案 0 :(得分:226)

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

要解析你的“Thu Jun 18 20:56:02 EDT 2009”日期字符串,你需要一个像这样的SimpleDateFormat(大致):

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

使用它将字符串解析为Date,然后使用其他SimpleDateFormat将该Date转换为您想要的格式。

        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

答案 1 :(得分:50)

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

Thu Jun 18 20:56:02 EDT 2009

但使用的是SimpleDateFormat

yyyy-MM-dd

这两种格式不一致。您需要构造一个SimpleDateFormat,它匹配您尝试解析为Date的字符串的布局。为了让它易于查看,您需要SimpleDateFormat这样的内容:

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

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

答案 2 :(得分:15)

我们现在有更现代的方式来完成这项工作。

java.time

java.time框架与Java 8及更高版本捆绑在一起。见Tutorial。这些新课程的灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目进行扩展。对于麻烦的旧类,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 );

跑步时。

  

zdt:2009-06-18T20:56:02-04:00 [America / New_York]

调整时区

为了好玩,让我们适应印度时区。

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

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

转换为j.u.Date

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

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

答案 3 :(得分:12)

getSelectedDate怎么样?无论如何,特别是在您的代码问题上,问题在于这一行:

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

构造函数中的字符串必须与日期的格式匹配。有关如何执行此操作的文档是here。看起来你需要的东西接近“EEE MMM d HH:mm:ss zzz yyyy”

答案 4 :(得分:1)

回应: “如何将2016年9月13日星期二00:00:00 GMT-0500(Hora de verano central(México))转换为Java中的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);
}