如何将 “星期一 Jun 18 00:00:00 IST 2012” 转换为 18/06/2012?java.time格式选择不当关于 java.time

2022-09-01 06:24:19

我有一个如下所示的值,我想将其转换为Mon Jun 18 00:00:00 IST 201218/06/2012

如何转换这个?

我试过这种方法

public String toDate(Date date) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date theDate = null;
        //String in = date + "/" + month + "/" + year;
        try {
            theDate = dateFormat.parse(date.toString());
            System.out.println("Date parsed = " + dateFormat.format(theDate));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateFormat.format(theDate);
    }

但它会引发以下异常:

java.text.ParseException: Unparseable date: "Mon Jun 18 00:00:00 IST 2012"


答案 1

我希望以下程序将解决您的问题

String dateStr = "Mon Jun 18 00:00:00 IST 2012";
DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
Date date = (Date)formatter.parse(dateStr);
System.out.println(date);        

Calendar cal = Calendar.getInstance();
cal.setTime(date);
String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" +         cal.get(Calendar.YEAR);
System.out.println("formatedDate : " + formatedDate);    

答案 2

java.time

现代方法是使用java.time类。它们取代了麻烦的旧旧日期时间类,如 、 、 和 。DateCalendarSimpleDateFormat

解析为 .ZonedDateTime

String input = "Mon Jun 18 00:00:00 IST 2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM dd HH:mm:ss z uuuu" )
                                       .withLocale( Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

提取一个仅包含日期的对象 a,不带任何时间,也没有任何时区。LocalDate

LocalDate ld = zdt.toLocalDate();
DateTimeFormatter fLocalDate = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
String output = ld.format( fLocalDate) ;

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ld: " + ld );
System.out.println( "output: " + output );

输入: 星期一 六月 18 00:00:00 IST 2012

zdt: 2012-06-18T00:00+03:00[亚洲/耶路撒冷]

手机: 2012-06-18

输出: 18/06/2012

请参阅此代码在 IdeOne.com 中实时运行

格式选择不当

您的格式是数据交换的糟糕选择:人类难以阅读,计算机难以解析,使用非标准的3-4个字母区域代码,并假设使用英语。

相反,请尽可能使用标准 ISO 8601 格式。java.time 类在解析/生成日期时间值时默认使用 ISO 8601 格式。

以 的格式指定适当的时区名称,例如 美国/蒙特利尔非洲/卡萨布兰卡或 。切勿使用3-4个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。例如,您使用的可能是爱尔兰标准时间、以色列标准时间(如上文所述的 java.time 解释)或印度标准时间。continent/regionPacific/AucklandESTISTIST


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter