【问题标题】:How to add days to java.sql.date?如何在 java.sql.date 中添加天数?
【发布时间】:2013-04-04 03:27:28
【问题描述】:

这是我的程序,我试过了

java.sql.Date logicalDate;
Calendar c = Calendar.getInstance(); 
c.setTime(logicalDate); 
c.add(Calendar.DATE, 1);

下面的行显示构造函数 Date(date) 未定义的错误

java.sql.Date startDate= new java.sql.Date(c.getTime());

如何将 1 天添加到 java.sql.Date logicalDate?

【问题讨论】:

  • 为 OP 的代码 sn-p 导入 java.util.Calendar
  • 仅供参考,存在严重缺陷的日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.建议在 2020 年使用它们是糟糕的建议。

标签: java date


【解决方案1】:

这是一个方法

private Date sqlDatePlusDays(Date date, int days) {
    return Date.valueOf(date.toLocalDate().plusDays(days));
}

【讨论】:

    【解决方案2】:

    tl;博士

    永远不要使用糟糕的遗留类java.sql.Datejava.util.Calendarjava.util.GregorianCalendarjava.util.Date。仅使用 java.time 类。

    如何将 1 天添加到 java.sql.Date 逻辑日期?

    从传统类 java.sql.Date 转换为现代类 java.time.LocalDate。然后调用plus…/minus… 方法来加/减天、周、月或年。

    myJavaSqlDate.toLocalDate().plusDays( 1 ) 
    

    如果给定一个Calendar,它实际上是一个GregorianCalendar,而您只需要日期,则转换为ZonedDateTime 并提取一个LocalDate

    ( (GregorianCalendar) myCal )   // Cast from general `Calendar` to more concrete class `GregorianCalendar`. 
    .toZonedDateTime()              // Convert from the legacy class to the modern `ZonedDateTime` class replacement.
    .toLocalDate()                  // Extract the date only, omitting the time-of-day and the time zone.
    .plusWeeks( 1 )                 // Returns a `LocalDate` object, a date without a time-of-day and without a time zone.
    

    java.time

    设计糟糕的java.sql.Date 类在几年前被现代java.time 类所取代,unanimous adoptionJSR 310。也避免使用Calendar 类。

    通过调用ResultSet::getObject,使用JDBC 4.2 从您的数据库中检索。

    LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ; 
    

    致电LocalDate::plusWeeks 增加一周。

    LocalDate weekLater = ld.plusWeeks( 1 ) ;
    

    通过调用PreparedStatement::setObject 写入数据库。

    myPreparedStatement.setObject( … , weekLater ) ;
    

    最好完全避免麻烦的遗留日期时间类。但是,如果您需要 java.sql.Date 对象与尚未更新到 java.time 的旧代码互操作,请使用添加到旧类的新转换方法。具体来说,java.sql.Date.valueOf

    java.sql.Date d = java.sql.Date.valueOf( ld ) ;
    


    关于java.time

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

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

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

    您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

    从哪里获得 java.time 类?

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

    【讨论】:

      【解决方案3】:

      Calendar#getTime 返回 java.util.Date 表示 Calendar。你真的需要改用Calendar#getTimeInMillis

      java.sql.Date startDate= new java.sql.Date(c.getTimeInMillis())
      

      【讨论】:

        【解决方案4】:
        import java.sql.Date;
        import java.time.LocalTime;
        import java.util.Calendar;
        import java.util.List;
        import java.util.stream.Collectors;
        
        public class Test {
        
            public static void main(String a[]) {
        
                java.sql.Date todaysDate = new java.sql.Date(new java.util.Date().getTime());
        
                int futureDay =1;
                int pastDay=2;
        
                java.sql.Date futureDate = this.addDays(todaysDate, futureDay);
                java.sql.Date pastDate = this.subtractDays(todaysDate, pastDay);
        
                System.out.println("futureDate =>>> " + futureDate);
                System.out.println("pastDate =>>> " + pastDate);
        
        
            }
        
            public static Date addDays(Date date, int days) {
                Calendar c = Calendar.getInstance();
                c.setTime(date);
                c.add(Calendar.DATE, days);
                return new Date(c.getTimeInMillis());
            }
        
            public static Date subtractDays(Date date, int days) {
                Calendar c = Calendar.getInstance();
                c.setTime(date);
                c.add(Calendar.DATE, -days);
                return new Date(c.getTimeInMillis());
            }
        
        }
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        【解决方案5】:

        试试这个:

        Calendar cNow = Calendar.getInstance();  
                Date dNow = cNow.getTime();  
                cNow.add(Calendar.DATE, 7);  
        
                Date dSeven = cNow.getTime();  
        
                SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a");  
        
                String dateNow = format.format(dNow);  
                String dayBefore = format.format(dSeven);  
                System.out.println(dateNow);  
                System.out.println(daySeven); //here is your current day + 7  
        
                Date date = new Date();  
                System.out.println(date);  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-02
          • 2019-10-18
          • 1970-01-01
          • 1970-01-01
          • 2012-02-03
          • 1970-01-01
          • 2021-02-05
          相关资源
          最近更新 更多