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

Java:无法将给定对象格式化为日期,java,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.Form

我有这种格式的日期(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.simpleDataFormat;
导入java.util.Date;
公共类日期分析器{
公共静态void main(字符串args[]){
字符串MonthYear=null;
SimpleDataFormat SimpleDataFormat=新SimpleDataFormat(“mm/yyyy”);
String dateformat=“2012-11-17T00:00:00.000-05:00
MonthYear=SimpleDataFormat.format(日期格式);
系统输出打印项次(月);
}    
}

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

您已经为输出设置了一个字符串,但是我没有看到任何与您的输入匹配的内容。当您将输入字符串指定给输出格式时,您会看到该异常也就不足为奇了

DateFormat inputDateFormat = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss.SSS-Z");

DateFormat.format
仅适用于
Date

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

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

<>编辑:注意,您可能希望在格式中指定时区和/或区域,并且还应该考虑使用所有这些来代替它——这是一个更好的日期/时间API。

<代码> SimuleDealFrase.Frad(…)将日期作为参数,并将日期格式化为字符串。因此,您需要仔细查看API

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;

    }

}
我想这段代码可以解决您的问题。

这对我来说很有效:

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);
java.time 我想提供一个现代的答案。
SimpleDateFormat
类是出了名的麻烦,虽然在六年半前提出这个问题时,我们有理由用它来解决问题,但今天我们的java.time(现代java日期和时间API)要好得多。
SimpleDateFormat
和它s friend
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);
输出:

2012年11月

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

你的代码出了什么问题
  • 正如其他人所说,
    SimpleDateFormat.format
    不能接受
    字符串
    参数,同样当参数类型声明为
    对象
  • 由于一个异常,您没有抽出时间来发现:您的格式模式字符串中还有一个错误,
    mm/yyyy
    。小写的
    mm
    os表示小时分钟数。您需要大写的
    mm
    表示月份
  • 最后,Java命名约定说在变量名中使用小写的第一个字母,所以在
    monthYear
    中使用小写的
    m
    (也因为Java.time包含一个带有大写字母
    m
    monthYear
    类,以避免混淆)
链接
  • 解释如何使用
    java.time

  • SimpleDateFormat#格式
    需要一个
    Date
    实例,而不是
    String
    。因此,您应该首先通过
    SimpleDateFormat#parse
    将字符串转换为
    Date
    。2019年注释:您不应该再使用
    SimpleDateFormat
    。该类是出了名的麻烦且早已过时ead使用
    DateTimeFormatter
    和中的其他类。您的答案看起来比我的好,我还有一个问题,如何从中仅获取17的日期(2012-11-17T00:00:00.000-05:00)?@yyyyi777:作为字符串或整数值?@yyyyi777:使用简单的格式“dd”或可能只是“d”“,这取决于你是否需要零填充。这对我有用,谢谢,
        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);