首页 > 解决方案 > 如何根据Nifi流中的给定年份范围获取每个月的第一个日期

问题描述

我想知道根据日期范围获取每个月的起始日期值的最佳方法是什么。

例如:如果给我一个年份范围2015-11-10 and 2018-01-15(格式 YYYY-mm-dd)。然后我想提取以下日期:

2015-12-01
2016-01-01
.
.
2018-01-01

标签: apache-nifi

解决方案


您可以尝试使用此流程在提供的日期范围内生成每个月的第一天。

总流量

在此处输入图像描述

步骤 1 配置:开始

在此处输入图像描述

步骤 2 配置:配置日期范围

通过此步骤提供开始和结束日期作为配置参数。 在此处输入图像描述

步骤 3 配置:生成月份的第一个日期

这使用了一个 Groovy 脚本,它在下面提供 在此处输入图像描述

Groovy 脚本

flowFile = session.get();
if(!flowFile)
    return;

DATE_FORMAT = 'yyyy-MM-dd';
startDate = Date.parse(DATE_FORMAT, flowFile.getAttribute("start_date"));
endDate = Date.parse(DATE_FORMAT, flowFile.getAttribute("end_date"));
allFirstDates = "";

Calendar calendar = Calendar.getInstance();
Set firstDaysOfMonths = new LinkedHashSet();

for (int i = 0; i <= endDate-startDate; i++) {
    calendar.setTime(startDate.plus(i));
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    firstDayOfMonth = calendar.getTime();
    if (firstDayOfMonth.compareTo(startDate) >= 0) {
        firstDaysOfMonths.add(calendar.getTime().format(DATE_FORMAT));
    }
}

firstDaysOfMonths.each {
    firstDayOfMonth -> allFirstDates = allFirstDates + firstDayOfMonth + "\n";
}

flowFile = session.putAttribute(flowFile,"all_first_dates", allFirstDates );
session.transfer(flowFile,REL_SUCCESS)

步骤 4 配置:查看结果

在此处输入图像描述

运行输出:

流运行时,属性all_first_dates将填充日期范围内每个月的第一个日期。

在此处输入图像描述


推荐阅读