如何在java.sql.date中添加天数?

时间:2013-04-04 03:27:28

标签: java java-ee date

这是我的程序,我试过

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());

如何在java.sql.Date logicalDate中添加1天?

5 个答案:

答案 0 :(得分:8)

Calendar#getTime返回java.util.Date的{​​{1}}个代表。您确实需要使用Calendar#getTimeInMillis而不是

Calendar

答案 1 :(得分:2)

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

}

答案 2 :(得分:2)

tl; dr

永远不要使用可怕的旧类java.sql.Datejava.util.Calendarjava.util.GregorianCalendarjava.util.Date。仅使用 java.time 类。

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

从旧类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类。

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

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

Table of date-time types in Java (both legacy and modern) and in standard SQL


关于 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 driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:1)

试试这个:

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

答案 4 :(得分:1)

这是一种方法

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