java.util.Date - Deleting three months from a date?

前端 未结 11 1573
北荒
北荒 2020-12-14 05:30

I have a date of type java.util.Date

I want to subtract three months from it.

Not finding a lot of joy in the API.

相关标签:
11条回答
  • 2020-12-14 06:20

    Here's the plain JDK version, it needs the Calendar class as a helper:

    Date referenceDate = new Date();
    Calendar c = Calendar.getInstance(); 
    c.setTime(referenceDate); 
    c.add(Calendar.MONTH, -3);
    return c.getTime();
    

    But you should seriously consider using the Joda library, because of various shortcomings of the Date and Calendar classes. With Joda you can do the following:

    new DateTime().minusMonths(3).toDate();
    

    Or if you want to subtract from a given date instead of the current:

    new DateTime(referenceDate).minusMonths(3).toDate();
    

    Update for Java 8: With Java 8 you can also use the new JSR 310 API (which is inspired by Joda):

    LocalDateTime.from(referenceDate.toInstant()).minusMonths(3);
    
    0 讨论(0)
  • 2020-12-14 06:20
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.MONTH, -3);
    

    Set your date using setTime method.

    0 讨论(0)
  • 2020-12-14 06:31

    Using Java 8 you can do it like this,

    Date d = Date.from(LocalDate.now().minusMonths(3).atStartOfDay(ZoneId.systemDefault()).toInstant());
    

    The LocalDate class has a lot of methods to help you make easy computations about dates like the above,

    // Add 2 months
    Date d = Date.from(LocalDate.now().plusMonths(2).atStartOfDay(ZoneId.systemDefault()).toInstant());
    // Add 5 days
    Date d = Date.from(LocalDate.now().plusDays(5).atStartOfDay(ZoneId.systemDefault()).toInstant());
    // Minus 1 day and 1 year
    Date d = Date.from(LocalDate.now().minusYears(1).minusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
    

    In order to compute time you can use the LocalDateTime class,

    // Minus 1 year, minus 1 days, plus 1 hour
    Date d = Date.from(LocalDateTime.now().minusYears(1).minusDays(1).plusHours(1).toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
    
    0 讨论(0)
  • 2020-12-14 06:32

    The Date class itself isn't enough (+: You've got to use the Calendar class here

    Something along these lines

    GregorianCalendar lCalendar = new GregorianCalendar();
    lCalendar.setTime( aDate );
    lCalendar.add(Calendar.MONTH, -3);
    

    p.s. the snippet above is not tested to be compilable.

    0 讨论(0)
  • 2020-12-14 06:35

    Ok with java.sql.Date (subclass of java.util.Date) and JDK's 8 LocalDate help you can do it in one line ;)

    Date date = java.sql.Date.valueOf(LocalDate.now().minus(3, ChronoUnit.MONTHS));
    
    0 讨论(0)
提交回复
热议问题