Java:无法将给定的对象格式化为日期
Posted
技术标签:
【中文标题】Java:无法将给定的对象格式化为日期【英文标题】:Java : Cannot format given Object as a Date 【发布时间】:2012-05-18 09:09:47 【问题描述】:我有这种格式的日期 (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);
【问题讨论】:
SimpleDateFormat#format
需要 Date
实例,而不是 String
。所以你应该先通过SimpleDateFormat#parse
将字符串转换为Date
。
2019 评论:你根本不应该再使用SimpleDateFormat
。这个类是出了名的麻烦和过时。而是使用DateTimeFormatter
和java.time, the modern Java date and time API 中的其他类。
【参考方案1】:
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。
【讨论】:
你的答案看起来比我的好,我还有一个问题,我怎样才能只得到 17 的日期(2012-11-17T00:00:00.000-05:00)? @yyyi777:作为字符串,还是作为整数值? @yyyi777:使用“dd”或可能只是“d”的 SimpleDateFormat,具体取决于您是否需要零填充。【参考方案2】: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
。小写 mm
os 表示小时的分钟。您需要大写 MM
来表示月份。
最后,Java 命名约定说在变量名中使用小写首字母,所以在monthYear
中使用小写m
(也因为java.time 包含一个MonthYear
类和大写M
,所以要避免混乱)。
链接
Oracle tutorial: Date Time 解释如何使用java.time
。
Wikipedia article: ISO 8601
【讨论】:
【参考方案3】:您有一个DateFormat
,但您需要两个:一个用于输入,另一个用于输出。
你有一个输出,但我没有看到任何与你的输入相匹配的东西。当您将输入字符串赋予输出格式时,您会看到该异常也就不足为奇了。
DateFormat inputDateFormat = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss.SSS-Z");
【讨论】:
【参考方案4】:SimpleDateFormat.format(...)
将日期作为参数并将日期格式化为字符串。所以你需要仔细看看API
【讨论】:
【参考方案5】:我已经解决了,这样
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;
【讨论】:
【参考方案6】: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;
我认为这段代码可以解决你的问题。
【讨论】:
【参考方案7】:这对我有用:
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:无法将给定的对象格式化为日期的主要内容,如果未能解决你的问题,请参考以下文章
线程“主”java.lang.IllegalArgumentException 中的异常:无法将给定对象格式化为数字
使用 DecimalFormat 进行格式化会引发异常 - “无法将给定对象格式化为数字”