2017-03-02 48 views
0

所以我使用的代码来解析字符串日期,但它做错了方式,所以它记录在我的mysql数据库中的格式错误。搞砸我的日期格式与java

像下面这样: 代码:

DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    System.out.println(new java.sql.Date(dateFormat.parse("2017-10-20").getTime())); 

输出:

0026-04-09 

我不知道如何扭转这种让二零一七年十月二十日出字符串0026的-04-09

+1

为什么不改变日期格式为'yyyy-MM-dd'呢? –

+0

在0026-04-09的日期试过了,它也给出了0026-04-09,问题在于我试图扭转我为其他日期记录的内容。 – CriminalDuck

+0

因此,您有'0026-04-09'你的数据库现在并且想要修改回'2017-10-20'?是以字符串还是日期存储?我不确定是否有防弹的方式,但有更多的信息可以更好地说明。 –

回答

1

我认为最安全和最不复杂的方法是做wro对于可能存在于数据库中的所有日期再次进行计算。然后你知道它们会产生什么,你将能够回到原来的日期。使用地图将错误的日期(如DateString)映射到应该出现的日期。

我使用

import java.sql.Date; 

我也使用LocalDateMonthjava.time - 这些需要Java 8.如果您使用的是Java 7,您可以使用java.util.Calendar代替。代码示例 - 进行调整以适应您的需求:

DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    Map<Date, Date> corrections = new HashMap<>(5500); // capacity for 11 years 
    LocalDate endDate = LocalDate.of(2020, Month.DECEMBER, 31); 
    LocalDate currentDate = LocalDate.of(2010, Month.JANUARY, 1); 

    do { 
     Date correctDate = Date.valueOf(currentDate); 
     String correctString = correctDate.toString(); 
     Date wrongDate = new Date(dateFormat.parse(correctString).getTime()); 

     if (corrections.containsKey(wrongDate)) { 
      System.out.println("Duplicate wrong date " + wrongDate); 
     } 

     corrections.put(wrongDate, correctDate); 

     currentDate = currentDate.plusDays(1); 
    } while (! currentDate.isAfter(endDate)); 

有了选择的日期,运行上面的代码并原因要打印的Duplicate wrong date线,所以2010至20年的时间内,我们可以转换回明确。解脱,不是吗?

现在你已经建立了地图,查找方便,例如:

Date wrongDate = new Date(dateFormat.parse("2017-10-20").getTime()); // 0026-04-09 
    Date correctDate = corrections.get(wrongDate); 
    if (correctDate == null) { 
     System.out.println("Could not find correction for " + wrongDate); 
    } else { 
     System.out.println(correctDate); 
    } 

这将打印所需:

2017-10-20 

你要确保你没有得到一个在将数值放回数据库之前,请使用null

如果你有一个现代的JDBC驱动程序,你应该也可以在上面的代码中避免java.sql.Date,并且使用现代的LocalDate和朋友。

+0

非常感谢!它对我有用 – CriminalDuck