【问题标题】:How to convert "Mon Jun 18 00:00:00 IST 2012" to 18/06/2012?如何将“Mon Jun 18 00:00:00 IST 2012”转换为 18/06/2012?
【发布时间】:2012-06-21 06:33:33
【问题描述】:

我有一个类似于以下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);
    }

但它会引发以下异常:

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

【问题讨论】:

  • 查看本页相关部分
  • @Kazekage Gaara 你现在可以看到我的编辑,让我们希望你是否知道答案。
  • 同意托尼的观点,如果不让其他人回答,您可以尝试回答,而不是投票给好评。
  • How to parse a date?的可能重复
  • @SAR 我面临同样的问题,请帮助

标签: java date


【解决方案1】:

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 年 6 月 18 日星期一 00:00:00 IST

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

日期:2012-06-18

输出:2012 年 6 月 18 日

看到这个code run live in IdeOne.com

格式选择不当

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

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

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


关于java.time

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

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个问题是关于 Java 编程,而不是 Microsoft Excel 电子表格。
    【解决方案3】:

    只需要添加: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);
    }
    

    【讨论】:

    【解决方案4】:

    希望下面的程序能解决你的问题

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

    【讨论】:

    • 我认为 dateStr 示例的格式应该是:SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy")跨度>
    • 谢谢,它帮助我:)
    • 代码运行良好,但应该是 z 而不是 Z。
    • @Pascal 我遵循相同的格式但无法解析("EEE MMM dd HH:mm:ss z yyyy")
    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2021-08-26
    相关资源
    最近更新 更多