Java:无法将给定对象格式化为日期

Paw*_*wan 46 java

我有这种格式的日期(2012-11-17T00:00:00.000-05:00).我需要将日期转换为这种格式mm/yyyy.

我试过这种方式,但我得到了这个例外.

Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Date
    at java.text.DateFormat.format(Unknown Source)
    at java.text.Format.format(Unknown Source)
    at DateParser.main(DateParser.java:14)
Run Code Online (Sandbox Code Playgroud)

请参阅下面的代码:

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateParser {    
    public static void main(String args[]) {   
        String MonthYear = null;    
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm/yyyy");    
        String dateformat = "2012-11-17T00:00:00.000-05:00
        MonthYear = simpleDateFormat.format(dateformat);    
        System.out.println(MonthYear);    
    }    
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 71

DateFormat.format仅适用于Date价值观.

您应该使用两个SimpleDateFormat对象:一个用于解析,另一个用于格式化.例如:

// Note, MM is months, not mm
DateFormat outputFormat = new SimpleDateFormat("MM/yyyy", Locale.US);
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US);

String inputText = "2012-11-17T00:00:00.000-05:00";
Date date = inputFormat.parse(inputText);
String outputText = outputFormat.format(date);
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,您可能希望以格式指定时区和/或区域设置,并且您应该考虑使用Joda Time而不是所有这些开始 - 这是一个更好的日期/时间API.


Ole*_*.V. 8

时间

我想贡献现代答案。这个SimpleDateFormat类是出了名的麻烦,虽然在六年半前问这个问题时用它来解决问题是合理的,但今天我们在 java.time,现代 Java 日期和时间 API 中有更好的表现。SimpleDateFormat和它的朋友Date现在被认为已经过时了,所以不要再使用它们了。

    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MM/uuuu");
    String dateformat = "2012-11-17T00:00:00.000-05:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(dateformat);
    String monthYear = dateTime.format(monthFormatter);
    System.out.println(monthYear);
Run Code Online (Sandbox Code Playgroud)

输出:

11/2012

我正在利用这样一个事实,即您的字符串采用国际标准 ISO 8601 格式,并且 java.time 的类将此格式解析为它们的默认值,即没有任何显式格式化程序。其他答案所说的仍然是真的,您需要先解析原始字符串,然后将生成的日期时间对象格式化为新字符串。通常这需要两个格式化程序,只有在这种情况下我们很幸运并且可以只使用一个格式化程序。

你的代码出了什么问题

  • 正如其他人所说,SimpleDateFormat.format不能接受String参数,当参数类型声明为Object.
  • 由于您没有发现的异常:您的格式模式字符串中也存在一个错误,mm/yyyy. 小写mmos 表示小时中的分钟。MM月份需要大写。
  • 最后,Java的命名约定说使用变量名的首字母小写,所以使用小写mmonthYear(也因为java.time包括MonthYear大写类M,所以要避免混淆)。

链接


duf*_*ymo 5

您有一个DateFormat,但您需要两个:一个用于输入,另一个用于输出。

您的输出中有一个,但看不到任何与您的输入匹配的东西。当您将输入字符串赋予输出格式时,看到该异常也就不足为奇了。

DateFormat inputDateFormat = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss.SSS-Z");
Run Code Online (Sandbox Code Playgroud)