64

我有这种格式的日期(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)

请在下面查看我的代码:

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

7 回答 7

102

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

编辑:请注意,您可能很想在格式中指定时区和/或语言环境,并且您应该考虑使用Joda Time而不是所有这些开始 - 这是一个更好的日期/时间 API。

于 2012-05-18T09:13:33.773 回答
8

java.time

我想贡献现代答案。这个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);

输出:

11/2012

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

你的代码出了什么问题

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

链接

于 2018-09-19T12:27:33.190 回答
5

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

你有一个输出,但我没有看到任何与你的输入相匹配的东西。当您将输入字符串提供给输出格式时,您看到该异常也就不足为奇了。

DateFormat inputDateFormat = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss.SSS-Z");
于 2012-05-18T09:10:51.393 回答
4

SimpleDateFormat.format(...)将日期作为参数并将日期格式设置为字符串。所以你需要仔细看看API

于 2012-05-18T09:14:34.580 回答
2

我已经解决了,这样

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateParser {

    public static void main(String args[]) throws Exception {

        DateParser dateParser = new DateParser();

        String str = dateParser.getparsedDate("2012-11-17T00:00:00.000-05:00");
        System.out.println(str);
    }


    private String getparsedDate(String date) throws Exception {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        String s1 = date;
        String s2 = null;
        Date d;
        try {
            d = sdf.parse(s1);
            s2 = (new SimpleDateFormat("MM/yyyy")).format(d);

        } catch (ParseException e) {

            e.printStackTrace();
        }

        return s2;

    }

}
于 2012-05-18T09:15:23.007 回答
1
public static String showDate(){
    SimpleDateFormat df=new SimpleDateFormat("\nTime:yyyy-MM-dd HH:mm:ss");
    System.out.println(df.format(new Date()));
    String s=df.format(new Date());
    return s;
}

我认为这段代码可以解决你的问题。

于 2016-12-12T08:51:17.127 回答
0

这对我有用:

String dat="02/08/2017";
long date=new SimpleDateFormat("dd/MM/yyyy").parse(dat,newParsePosition(0)).getTime();
java.sql.Date dbDate=new java.sql.Date(date);
System.out.println(dbDate);
于 2017-08-02T08:15:18.813 回答