Java日期问题

时间:2010-02-02 12:44:16

标签: java formatting date

当我将1949年之前的日期传递给波纹管方法时,我遇到了java日期的问题。 我返回的日期是例如2049年,我知道它与日期格式有关,并且认为使用yyyy而不是RRRR会修复它。但我只是不明白为什么或如何重新获得它。任何帮助都会被贬低

public static java.sql.Date parseDate(String date) throws ParseException {
  if (date != null) {
   SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
   return new java.sql.Date(dateFormat.parse(date).getTime());
  }
  return null;
 }

感谢Jon

2 个答案:

答案 0 :(得分:2)

让我为你格式化..

public static java.sql.Date parseDate(String date) throws ParseException {
    if (date != null) { 
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
        return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } 
    return null; 
}

我怀疑这就是你想要的......

private Date convertDate() throws ParseException
{
    String dateStr = "21-02-2010";
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    Date date = null;
    if (dateStr != null)
    {
      date = new Date(dateFormat.parse(dateStr).getTime());
    }

    System.out.println(date);
    return date;
}

2010年2月21日,你会得到...... Sun Feb 21 00:00:00 GMT 2010

对于21-02-1938,你会得到...... 星期一2月21日00:00:00 GMT 1938

这有帮助吗?我可能是因为你的代码中有MMM。

答案 1 :(得分:0)

TL;博士

java.sql.Date.valueOf( 
    LocalDate.parse( "12-Jan-23" , DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) ) 
)

时区

您的代码忽略了时区的关键问题。确定日期需要时区。对于任何特定时刻,日期在全球范围内因地区而异。

您的代码使用始终为UTC的Date。因此,从错误命名的Date类生成的日期值对于UTC是准确的,但对America/MontrealAsia/Kolkata等其他时区无效。

使用java.time

这项工作的现代方法是使用java.time类来取代麻烦的旧遗留日期时间类。

LocalDate类表示没有时间且没有时区的仅限日期的值。

要解析传入的字符串,请使用DateTimeFormatter定义格式设置模式。为翻译月份名称时使用的人类语言指定Locale

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US );
LocalDate localDate = LocalDate.parse( "12-Jan-2017" , f );

使用JDBC 4.2及更高版本,您可以使用LocalDatesetObject方法将getObject直接传递到您的数据库。

对于尚未更新的JDBC驱动程序,请回退到java.sql类型。

java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
LocalDate localDate = sqlDate.toLocalDate();

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore