如何从java中的给定日期获取12个月前的日期

时间:2019-11-22 08:16:02

标签: java date java-date

如何从java中给定的日期获取12个月前的日期

例如:输入-2019年11月12日      输出-12 / Nov / 2018

4 个答案:

答案 0 :(得分:3)

问题

这不是一个罕见的问题,之前已经被问过很多次了。

问题是,我至少可以想到4种方法,但是(到目前为止)仅推荐一种方法。

1。手动操作

这是将String的值分解为单独的部分并从中减去值的时候。

这绝不是一个好主意,并且可能是您最糟糕的事情。手动时间操作(即使是毫秒级)也不是您要寻找的解决方案-围绕日期/时间有很多规则。

2。使用Calendar

Java 1.1引入了Calendar类,在没有更好的东西的情况下,我们忍受了。如果您一无所有,您仍然应该避免使用

您可以浏览一下,看看为什么不再建议使用它,例如5 Reasons Why Java's old Date and Calendar API was Bad

3。乔达时间

在Java 8引入新的日期/时间API之前,这将是推荐用于日期/时间操作的库。

如果您仍在使用低于8的Java版本,则应考虑改用ThreeTen Backport库,该库采用Java 8中的date / Time API,并使其可用于Java的早期版本。我相信也有适用于Android的版本。

4。 Java 8+日期/时间API

Java 8引入了一个新的date/time API,这是目前推荐的在Java中操作日期/时间值的方法。

在几乎所有情况下,都不建议使用其他方法,因此应避免使用它们(并且如果不能,请使用ThreeTen反向端口!)

因此,以最简单的形式,您可以使用...来实现您的目标。

LocalDate startDate = LocalDate.of(2019, Month.NOVEMBER, 12);
LocalDate endDate = startDate.minusYears(1);

System.out.println(startDate);
System.out.println(endDate);

将打印哪个

2019-11-12
2018-11-12
  

但是等等,我的输入是String

然后,您将需要使用DateTimeFormatter,配置为匹配您的输入,然后将其解析为LocalDate值。

但是,再次goggling的一点点将展示出大量的可能性和示例

  

但是我希望输出格式设置为[在此处插入所需的输出格式]

然后,您将需要使用DateTimeFormatter,将其配置为匹配所需的输出,然后格式化LocalDate

同样,goggling的一小部分将展示大量的可能性和示例

答案 1 :(得分:0)

您可以使用此方法从任意日期减去月份数

public static String subtractMonthsFromDate(String date, int month, String dateFormat) {
    final SimpleDateFormat format = new SimpleDateFormat(dateFormat);
    Calendar calendar=Calendar.getInstance();
    try {
        calendar.setTime(format.parse(date));
        calendar.add(Calendar.MONTH, -month);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return format.format(calendar.getTime());
}

答案 2 :(得分:-1)

您可以使用日历对象实例:-

private static String getPrevious12MonthDate(Date date){
    final SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");

    Calendar cal = Calendar.getInstance();  
    cal.setTime(date);  
    cal.set(Calendar.MONTH, -12);  

    Date pre12MonthDate = cal.getTime();  
    return format.format(preMonthDate);
}

答案 3 :(得分:-4)

最佳解决方案取决于您如何表示日期。我创建了两个函数来完成您的任务。一个接受日期格式(“ dd / MM / YYYY”)的字符串输入,另一个使用DateTimeFormatter类将LocalDate对象转换为字符串。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class Main{

  public static void main(String args[]){

    System.out.println(subtractYear("10/10/2019")); // Prints 10/10/2018
    System.out.println(subtractYear("10/10/1999")); // Prints 10/10/1998
    System.out.println(subtractYear("10/10/10")); // Prints 10/10/9
    System.out.println(subtractYear(LocalDate.now())); // Prints 22/11/2018
  }

  /**
  * @param date Assumed to be in shape of dd/mm/yyyy
  */
  public static String subtractYear(String date){
    int year = 0;
    try {
      year = Integer.parseInt(date.substring(6));
    } catch (Exception e){
      // Invalid param
      return null;
    }
    String prevYear = date.substring(0,6) + (year - 1);
    return prevYear;
  }


  public static String subtractYear(LocalDate date){
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/YYYY");
    return subtractYear(dtf.format(date));
  }
}