如何将“Mon Jun 18 00:00:00 IST 2012”更改为2012年6月18日?

我有一个类似于以下的Mon Jun 18 00:00:00 IST 2012 ,我希望将其转换为18/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); } 

但它抛出以下exception:

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

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

 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); 

只需要添加:new SimpleDateFormat(“bla bla bla”,Locale.US)

 public static void main(String[] args) throws ParseException { java.util.Date fecha = new java.util.Date("Mon Dec 15 00:00:00 CST 2014"); DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US); Date date; date = (Date)formatter.parse(fecha.toString()); 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); } 

您还可以在Excel中使用公式,以便将此类型的日期转换为excel可读取的日期类型: =DATEVALUE(CONCATENATE(MID(A1,8,3),MID(A1,4,4),RIGHT(A1,4)))

你会得到: Wed Dec 07 00:00:00 UTC 2016 12/7/2016来自: Wed Dec 07 00:00:00 UTC 2016

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 ); 

提取仅限日期的对象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 ); 

输入:2012年1月18日00:00:00 IST

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

ld:2012-06-18

输出:18/06/2012

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

格式选择不佳

您的格式是数据交换的不良选择:难以阅读,难以通过计算机解析,使用非标准的3-4字母区域代码,并采用英语。

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

continent/region的格式指定适当的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。 例如,您对IST的使用可能是爱尔兰标准时间,以色列标准时间(由java.time解释,见上文)或印度标准时间。


关于java.time

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

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

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

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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