Java/Javascript/ECMAScript实现时间范围匹配及日期格式对齐问题
解决NiFi中两种时间格式的对比问题
JavaScript/ECMAScript 实现(NiFi ExecuteScript 适用)
核心逻辑
- 日期统一:将第二种格式的星期缩写(如
Mon)转为全大写(MON),与第一种格式的键名日期对齐,实现直接对比 - 时间转换:将12小时制时间(如
08:30am)转为24小时制,并移除小时的前导零,匹配第一种格式(如8:30)
代码示例
// 从FlowFile中获取实际数据,此处为模拟输入 const firstFormatDateKey = "MON"; // 第一种格式的日期键名 const secondFormatTimeValue = "Mon 08:30am - 04:30pm"; // 第二种格式的数组值 // 1. 提取并标准化第二种格式的日期 const secondDate = secondFormatTimeValue.split(" ")[0].toUpperCase(); // 2. 对比日期 if (secondDate === firstFormatDateKey) { // 3. 提取时间段并拆分开始/结束时间 const timeSegment = secondFormatTimeValue.split(" ").slice(1).join(" ").replace(" - ", "-"); const [startTimeStr, endTimeStr] = timeSegment.split("-"); // 12小时制转24小时制,移除小时前导零 function convertTo24h(timeStr) { const [hourMin, period] = timeStr.match(/(\d+:\d+)([ap]m)/i).slice(1); let [hour, min] = hourMin.split(":"); hour = parseInt(hour); // 处理上下午转换 if (period.toLowerCase() === "pm" && hour !== 12) { hour += 12; } else if (period.toLowerCase() === "am" && hour === 12) { hour = 0; } // 返回无前置零的格式 return `${hour}:${min}`; } const convertedStart = convertTo24h(startTimeStr); const convertedEnd = convertTo24h(endTimeStr); const finalTimeFormat = `${convertedStart}-${convertedEnd}`; // 输出或写入FlowFile,此处为控制台打印 console.log(`匹配日期:${secondDate}`); console.log(`转换后时间:${finalTimeFormat}`); // 输出:8:30-16:30 } else { console.log("日期不匹配"); }
使用说明
将代码放入NiFi的ExecuteScript处理器,选择ECMAScript作为脚本语言,根据实际数据结构调整输入提取逻辑(比如从JSON内容或属性中获取对应值)。
Java 实现(NiFi ExecuteScript/自定义处理器适用)
核心逻辑
- 利用Java 8+的时间API,统一日期格式为大写星期缩写
- 解析12小时制时间并转换为无前置零的24小时制格式
代码示例
import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class TimeConverter { public static void main(String[] args) { // 模拟输入,实际需从FlowFile中读取 String firstDateKey = "MON"; String secondTimeValue = "Mon 08:30am - 04:30pm"; // 1. 提取并标准化日期 String secondDate = secondTimeValue.substring(0, 3).toUpperCase(); if (secondDate.equals(firstDateKey)) { // 2. 拆分开始/结束时间字符串 String[] timeParts = secondTimeValue.split(" - "); String startStr = timeParts[0].substring(4); // 跳过"Mon "前缀 String endStr = timeParts[1]; // 定义时间解析/格式化器 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("hh:mma", Locale.ENGLISH); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("H:mm"); // H表示24小时制,无前置零 // 转换时间格式 LocalTime startTime = LocalTime.parse(startStr, inputFormatter); LocalTime endTime = LocalTime.parse(endStr, inputFormatter); String convertedStart = startTime.format(outputFormatter); String convertedEnd = endTime.format(outputFormatter); String finalTimeStr = convertedStart + "-" + convertedEnd; // 输出结果 System.out.println("匹配日期:" + secondDate); System.out.println("转换后时间:" + finalTimeStr); // 输出:8:30-16:30 } else { System.out.println("日期不匹配"); } } }
使用说明
- 若用
ExecuteScript处理器,选择Java语言并导入所需类,调整数据读取逻辑适配FlowFile内容 - 如需批量处理结构化数据,可基于此逻辑编写自定义
RecordProcessor集成到NiFi的UpdateRecord等处理器中
内容的提问来源于stack exchange,提问作者Destiel
相关产品推荐
相关产品推荐

