关于java:如何解析日期?

How to parse a date?

本问题已经有最佳答案,请猛点这里访问。

我试图用SimpleDateFormat来解析这个日期,但它不起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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中得到这个日期的,并且没有关于当用户选择日期时如何修改我得到的日期格式的说明。


不能期望使用使用其他格式设置的simpledateformat分析日期。

要分析您的"Thu Jun 18 20:56:02 EDT 2009"日期字符串,您需要这样的简单日期格式(大致):

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

使用它将字符串解析为日期,然后使用其他simpledateformat将该日期转换为所需的格式。

1
2
3
4
5
6
7
        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
Thu Jun 18 20:56:02 EDT 2009

但使用的是SimpleDateFormat,即:

1
yyyy-MM-dd

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

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

检查我链接到的javadoc页面,看看字符是如何使用的。


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

Java.时间

JavaTimeFrand与Java 8和以后绑定。见教程。这些新类受jsr310定义的joda time的启发,并由threeten额外项目扩展。它们对麻烦的旧类Java.UTI.Deal/Calm等有很大的改进。

注意,像EDT这样的3-4字母代码既不标准,也不唯一。尽可能避免。学习使用ISO 8601标准格式。java.time框架可能在翻译方面有点困难,但许多常用的代码都有重复的值。

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

1
2
3
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 );

转储到控制台。

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

运行时。

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

调整时区

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

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

zdtKolkata : 2009-06-19T06:26:02+05:30[Asia/Kolkata]

转换为J.U.日期

如果您真的需要java.util.date对象用于尚未更新为java.time类型的类,请转换。请注意,您将失去分配的时区,但将相同的时间自动调整为UTC。

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


GetSelectedDate怎么样?不管怎样,特别是在代码问题上,问题在于这一行:

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

构造函数中的字符串必须与日期的格式匹配。如何做到这一点的文档就在这里。看起来你需要一些接近"eee-mmm-d-hh:mm:ss-zzz-yyyy"的东西。


回应:"如何将9月13日2016日下午6点00分GMT-0500(Hora de verano中心(MexxCo))转换成Java中的DD My YY?",它被标记为如何复制

试试这个:对于java.util.Datejava.text.SimpleDateFormat来说,这是一个简单的解决方案。

1
2
3
4
5
6
7
8
9
10
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);
}