2012-03-05 43 views
1

我试图将一个字符串解析为格式yyyy-MM-dd和一个格式为yyyy-MM-dd HH:mm:ss。我正在使用SimpleDateFormatJava:SimpleDateFormat - 无法将字符串解析为所需格式的日期

我以前成功地使用了相同的方法,但现在出现了问题。我得到标准格式的日期,即Tue Mar 05 00:00:00 GMT+05:30 2012(对于yyyy-MM-dd)和Mon Mar 05 13:01:35 GMT+05:30 2012(对于yyyy-MM-dd HH:mm:ss),因为我需要它们分别是2012-03-052012-03-05 13:01:35

这是我做的:

Date today = new Date(); 
SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
try { 
    today = tsdf.parse(tsdf.format(new Date())); 
} catch(Exception e) { 
    System.out.println("Error occurred"+ e.getMessage()); 
} 

System.out.println(today); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
try { 
    // I recieve a string in this format here (refers to 5 march 2012). 
    myDate = sdf.parse('2012-03-05');    
    System.out.println(myDate); 
} catch(Exception e) { 
    System.out.println("Error occurred "+ e.getMessage()); 
} 
+1

你得到的错误是什么?是否有堆栈跟踪?或者你以什么格式获得日期? – TrueDub 2012-03-05 08:45:17

+1

'2012-03-05'应该是“2012-03-05” – radimpe 2012-03-05 08:46:30

+0

请显示异常堆栈跟踪(由e.printStackTrace()生成) – 2012-03-05 08:47:27

回答

2
today = tsdf.parse(tsdf.format(new Date())); 
System.out.println(today); 

在我看来像你期望的那样,该Date实例都有格式化。事实并非如此。 A Date实例表示可将格式化为“到”字符串的日期。它是一个简单的持有long值的类(意思就像“以毫秒为单位的时间”)。

这将使预期的结果:如果您想格式化Date实例

Date today = new Date(); 
String formattedDate = tsdf.format(today); 
System.println(formattedDate);  // <- we print the string!! 
+0

你说得对,我认为日期对象是格式化的。其实我不需要打印日期,我想在数据库中插入一个包含这个日期的记录。我得到错误插入。 – kanishk 2012-03-05 09:05:31

+2

什么样的错误?注意使用正确的类:您可能需要'java.sql.Date'而不是'java.util.Date'。 – 2012-03-05 09:19:56

3

你不是输出是格式化的结果字符串,你输出的实际日期对象。这将始终是Date.toString()的结果,对于您使用的JDK而言,它是您看到的格式。不要将格式化的字符串转换回日期对象,只需将其打印出来!

SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
try { 
    String formattedDate = tsdf.format(new Date()); 
} catch(Exception e) { 
    System.out.println("Error occurred"+ e.getMessage()); 
} 

System.out.println(formattedDate); 

您不能将一个“格式”的java.util.Date对象供以后使用。它只是毫秒的原始数字,它的toString方法将始终打印相同的表示形式。您必须将其转换为格式化的字符串并使用该字符串。

+0

你是对的感动! – kanishk 2012-03-05 09:31:09

+0

是否需要尝试捕获tsdf.format(new Date())?我知道tsdf.parse(字符串日期)需要try-catch,但我不相信我们需要它为tsdf.format(日期日期)。 – George 2015-06-11 07:14:01

0

,你不必须使用parse方法,你必须使用format方法如下:

Date today = new Date(); 
    SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd"); 
    try 
    { 
     System.out.println(tsdf.format(today)); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Error occurred" + e.getMessage()); 
    } 

parse用于将字符串转换为日期的方法,以及format用于格式化a Date实例以按指定格式进行字符串转换的方法。

0

java.time

您现在使用由java.time类取代了旧的麻烦日期时间类。

java.time框架内置于Java 8及更高版本。这些课程取代了老的麻烦日期时间课程,如java.util.Date,.Calendar,& java.text.SimpleDateFormatJoda-Time团队还建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。

大部分的java.time功能后移植到Java 6 并且还适于在ThreeTenABP到Android。

LocalDate

对于日期只值,使用LocalDate类。您的输入值采用标准ISO 8601格式。在java.time类中默认使用ISO 8601格式来解析和生成表示日期 - 时间值的字符串。所以不需要指定格式化模式。

LocalDate localDate = LocalDate.parse("2012-03-05"); 

要生成这样的字符串,请拨打toString

String output = localDate.toString(); 

LocalDateTime

对于一个字符串,如2012-03-05 12:34:56我们有一个问题。没有指示从UTC或时区的偏移量。所以它不代表时间线上的实际时刻,而是对可能时刻的粗略想法。这个非时刻在java.time中由LocalDateTime类表示。

您的字符串格式是ISO 8601的一种变体,而规范版本的中间而不是空间中有T。所以一种选择是用T替换SPACE。

LocalDateTime ldt = LocalDateTime.parse("2012-03-05 12:34:56".replace(" " , "T"); 

或定义一个模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); 
LocalDateTime ldt = LocalDateTime.parse("2012-03-05 12:34:56" , formatter); 

避免使用缺少偏移量或时区信息的日期时间格式,如果它们确实代表时间轴上的实际时刻。

ZonedDateTime

,得到价值意义,以确定时间轴上的实际的时刻,我们需要对分配的日期,时间预期的时区。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ldt.atZone(zoneId); 

toString调用生成在于通过附加在方括号中的时区的名称延伸的ISO 8601标准格式的格式的字符串。

String output = zdt.toString(); // Yields: 2012-03-05T12:34:56-04:00[America/Montreal] 

如果你想省略T,你可以使用String::replace方法的空格替换。或者使用格式化程序。如果你真的想要一个字符串,如缺少任何偏移或时区信息的问题(根据我的建议)使用上面显示的相同格式化程序。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); // Not recommended as it lacks offset/zone info. 
String output = zdt.format(formatter); // Yields: 2012-03-05 12:34:56 
相关问题