You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:35:37