Java - 日期构造函数接受日期字符串,但已弃用。尝试过替代方案,但没有运气

问题描述 投票:0回答:4
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"
java datetime date
4个回答
12
投票

你的解析模式是错误的。它与日期字符串表示形式不匹配。

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小时。


2
投票

乍一看,你的格式字符串好像是错误的。

MMM——您指定了月份,但您没有传递 3 个字符的月份。

尝试MM看看是否有帮助。

查看此内容以获取一些其他日期格式信息:

http://www.java2s.com/Tutorial/Java/0040__Data-Type/SimpleDateFormat.htm


1
投票

您为 SimpleDateFormat 指定的格式在月、日和年之间使用

-
。 您的字符串使用斜杠。


0
投票

java.time

在现代 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

© www.soinside.com 2019 - 2024. All rights reserved.