【问题标题】:Java Date issuesJava 日期问题
【发布时间】:2010-02-02 12:44:15
【问题描述】:

当我将 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;
 }

谢谢乔恩

【问题讨论】:

  • String date 的外观如何?评论:1)你应该使用java.util.Date而不是java.sql.Date。 2) 你应该使用 Joda Time 而不是java.util.Date
  • “我的 java date 有问题” - 没关系,每个人都有

标签: java formatting date


【解决方案1】:

让我为你格式化..

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;
}

对于 21-02-2010,您将获得... 2010 年 2 月 21 日星期日 00:00:00 GMT

对于 21-02-1938,您将获得... 1938 年 2 月 21 日星期一 00:00:00 GMT

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

【讨论】:

    【解决方案2】:

    tl;博士

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

    时区

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

    您的代码使用Date,它始终采用 UTC。因此,从错误命名的 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 及更高版本,您可以使用 setObjectgetObject 方法将 LocalDate 直接传递到您的数据库。

    对于尚未更新的 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.DateCalendarSimpleDateFormat

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

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-02
      • 2018-08-24
      • 2014-11-28
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多