无法将字符串dd/MM/yyyy转换为日期dd/MM/yyyy in java

问题描述:

我有一个格式为dd/MM/yyyy的输入字符串,我需要将它转换为日期dd/MM/yyyy无法将字符串dd/MM/yyyy转换为日期dd/MM/yyyy in java

我的做法是:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
String date = formatter.format(formatter.parse("22/09/2016")); 
Date convertedDate = formatter.parse(date); 

我期待22/09/2016为日期对象,但是格式返回不符合预期。 O/P=>Mon Sep 12 00:00:00 IST 2016

任何想法我错了?提前致谢!

+0

我认为你是过于复杂的事情。看看[这个答案](http://*.com/a/6252782/5292801) – Takarii

+1

从你的角度来看,你应该更好地描述什么是错的。因为'formatter.parse(“22/09/2016”)'已经是你想要的东西了'我期待着2016/9/29作为日期对象。 – SubOptimal

+0

@Takarii我没有使用joda库 –

您似乎认为java.util.Date“知道”一种格式。它没有。这不是其状态的一部分 - 它是只是自Unix纪元以来的毫秒数。 (没有时区 - 您看到的IST是当地时区;这只是Date.toString()所做的一部分。)

基本上,Date只是一个时间瞬间 - 当您想要特定格式价值,那就是当你使用SimpleDateFormat

(或更好,使用java.time.* ...)它

认为象数 - 数以16为同一个号码,你是否代表以二进制为10000,小数为16或十六进制为0x10的。一个int值没有任何“我是二进制整数”或“我是一个十六进制整数”的概念 - 只有当您将其转换为需要关注格式的字符串时。日期/时间类型完全相同。

try { 
      SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
      Date d = formatter.parse("22/09/2016"); 
      System.out.println(d.toString()); 
      String e = formatter.format(d); 
      System.out.println(e); 
     } catch (ParseException ex) { 
      Logger.getLogger(Json.class.getName()).log(Level.SEVERE, null, ex); 
     } 
+0

它仍然返回一个字符串,不是吗?我需要一个日期对象。 –

+0

@robot_alien是的,你可以使用'd'对象。它的日期类型 –

A Date,打印时会调用该对象的toString方法。然后它会选择任何想要的格式。

尝试

System.out.println(formatter.format(convertedDate)); 

或 - 显然

System.out.println(date); 

TL;博士

LocalDate.parse("22/09/2016" , DateTimeFormatter.ofPattern("dd/MM/yyyy")) 
     .format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) 

问题

  • 你混为一谈日期时间对象与字符串表示日期时间值。日期 - 时间对象可以解析一个字符串,并且可以生成一个字符串,但日期 - 时间对象总是与字符串分离并且不同。 该字符串具有格式;日期时间对象确实是而不是
  • 您正在使用现在由java.time类取代的麻烦的旧日期时间类。
  • 您正试图将仅限日期的值放入日期时间对象(方形圆孔中的圆形钉)。
  • 您被设计不佳的toString方法欺骗,该方法将一个时区静默地应用于没有时区(即UTC)的内部值。

请务必阅读the correct Answer by Jon Skeet

java.time

使用新java.time类,特别是LocalDateLocalDate类表示没有时间和不带时区的仅限日期的值。

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
LocalDate ld = LocalDate.parse("22/09/2016" , f); 

生成字符串通过调用toString来表示标准ISO 8601格式值。

String output = ld.toString(); // 2016-09-22 

通过应用格式化程序生成所需格式的字符串。

String output = ld.format(f); 

关于java.time

java.time框架是建立在Java 8和更高版本。这些类代替了令人讨厌的旧日期时间类,例如java.util.Date,.Calendar,& java.text.SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。

大部分的java.time功能后移植到Java 6 和ThreeTenABP还适于Android(见How to use…)。

ThreeTen-Extra项目扩展java.time与其他类。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore