如何在 Java 中生成季度日期序列?

Mr.*_*elt 2 java r date

我正在尝试在 Java 中创建一个函数,在给定开始和结束日期的情况下生成季度日期序列。

例如,在 R 中,我可以按如下方式执行此操作:

generateQuarterlySequence = function(startDate, endDate)
{
  require(zoo)

  # Generate date sequence
  dateSequence = seq.Date(from = as.Date(startDate), 
                          to = as.Date(endDate), 
                          by = "quarter")

  # Convert to quarters
  dateSequence = as.yearqtr(dateSequence, format = "%Y-%m-%d") 

  # Get rid of extra white space
  dateSequence = gsub(" ", "", dateSequence) 

  return(dateSequence)

}

generateQuarterlySequence(startDate = "2017-06-30", endDate = "2017-12-31")
[1] "2017Q2" "2017Q3" "2017Q4"
Run Code Online (Sandbox Code Playgroud)

有没有摇滚明星愿意展示这是如何在 Java 中完成的?你会让这个 Java 初学者非常开心!

干杯,乔

Ole*_*.V. 5

我知道在评论中我建议了ThreeTen-Extra。但是,这里有一个解决方案java.time,在 Java 8 及更高版本中使用 pure as built-in 并通过ThreeTen Backport在 Java 6 和 7 中可用

public static List<String> generateQuarterlySequence(LocalDate startDate, LocalDate endDate) {
    // first truncate startDate to first day of quarter
    int startMonth = startDate.getMonthValue();
    startMonth-= (startMonth - 1) % 3;
    startDate = startDate.withMonth(startMonth).withDayOfMonth(1);

    DateTimeFormatter quarterFormatter 
            = DateTimeFormatter.ofPattern("uuuuQQQ", Locale.ENGLISH);
    List<String> quarterSequence = new ArrayList<>();

    // iterate thorough quarters
    LocalDate currentQuarterStart = startDate;
    while (! currentQuarterStart.isAfter(endDate)) {
        quarterSequence.add(currentQuarterStart.format(quarterFormatter));
        currentQuarterStart = currentQuarterStart.plusMonths(3);
    }
    return quarterSequence;
}
Run Code Online (Sandbox Code Playgroud)

用您的示例参数尝试一下:

    System.out.println(generateQuarterlySequence(LocalDate.of(2017, Month.JUNE, 30),
            LocalDate.of(2017, Month.DECEMBER, 31)));
Run Code Online (Sandbox Code Playgroud)

印刷

[2017Q2, 2017Q3, 2017Q4]
Run Code Online (Sandbox Code Playgroud)