String temp_date="07/28/2011 11:06:37 AM";
Date date = new Date(temp_date); //Depricated
SimpleDateFormat sdf = new SimpleDateFormat("MMM-dd-yyyy hh:mm:ss");
String comp_date= sdf.format(date);
System.out.println(comp_date);
这可行,但是如果我使用这样的东西
String temp_date="07/28/2011 11:06:37 AM";
try{
SimpleDateFormat sdf = new SimpleDateFormat("MMM-dd-yyyy hh:mm:ss");
Date comp_date= sdf.parse(temp_date);
System.out.println(comp_date);
}catch(Exception e){
System.out.println(e);
}
抛出此异常:
java.text.ParseException: Unparseable date: "07/28/2011 11:06:37 AM"
你的解析模式是错误的。它与日期字符串表示形式不匹配。
MMM
表示 3 个字母的本地化月份缩写,而您的实际日期中有 2 位数字的月份数字,则需要 MM
。您还使用斜线 /
作为日期/月/年分隔符,而不是 -
。对于 AM/PM 标记,您还需要一个 a
,以便可以解析正确的 hh
。
这应该有效:
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
SimpleDateFormat
javadoc。
我相信您的具体功能需求是将模式
MM/dd/yyyy hh:mm:ss a
指定的给定日期字符串转换为模式MMM-dd-yyyy hh:mm:ss
指定的另一种日期字符串格式。在这种情况下,您应该有两个 SimpleDateFormat
实例,一个将给定模式中的字符串解析为 Date
,另一个将解析后的 Date
格式化为给定模式。这应该可以满足您的要求:
String inputDate = "07/28/2011 11:06:37 AM";
Date date = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a").parse(inputDate);
String outputDate = new SimpleDateFormat("MMM-dd-yyyy HH:mm:ss").format(date);
System.out.println(outputDate); // Jul-28-2011 11:06:37
请注意,我将输出中的
hh
更改为 HH
,因为否则最终会以 1-12 小时的形式表示,而没有 AM/PM 标记。 HH
代表0-23小时。
乍一看,你的格式字符串好像是错误的。
MMM——您指定了月份,但您没有传递 3 个字符的月份。
尝试MM看看是否有帮助。
查看此内容以获取一些其他日期格式信息:
http://www.java2s.com/Tutorial/Java/0040__Data-Type/SimpleDateFormat.htm
您为 SimpleDateFormat 指定的格式在月、日和年之间使用
-
。 您的字符串使用斜杠。
在现代 Java 中,使用 JSR 310 中定义的 java.time 类,这些类内置于 Java 8+ 中。
定义格式模式以匹配您的输入字符串。
使用两个
M
字符表示月份数字,MM
,而不是三个。三是文本中的月份名称而不是月份编号。
使用匹配字符作为分隔符。在您的输入中,这意味着 SOLIDUS(斜杠)字符而不是连字符。
String input = "07/28/2011 11:06:37 AM";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm:ss a" ) ;
我们还需要
Locale
来指定解析 AM/PM 时使用的人类语言和文化规范。
Locale locale = Locale.of( "en" , "US" ) ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm:ss a" ).withLocale( locale ) ;
您的输入表示带有当天时间的日期,但缺少时区上下文或相对于 UTC 的偏移量。所以解析为
LocalDateTime
.
请注意,您的输入和
LocalDateTime
类,not 代表某个时刻,not 是时间线上的一个点。如果没有区域或偏移量,我们无法知道您的输入是否意味着日本东京的上午 11 点、法国图卢兹的上午 11 点或俄亥俄州托莱多的上午 11 点 — 三个截然不同的时刻,相隔几个小时。
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
请参阅此 在 Ideone.com 上运行的代码。
ldt.toString():2011-07-28T11:06:37