如何用纯CFML将2023-W12格式周转换为对应周的周一日期?
纯CFML实现ISO周标识转该周周一日期
问题分析
你用dateFormat('2023-W12', 'yyyy-mm-dd')报错,是因为dateFormat要求第一个参数必须是java.util.Date类型,而2023-W12是字符串,CFML无法自动解析这种ISO周格式为日期对象,必须手动处理。
以下是两种可行的纯CFML实现思路:
思路1:调用Java Calendar类(符合ISO周规则)
利用CFML可直接调用Java类的特性,按照ISO周标准(周一为一周起始,第一周包含当年1月4日)计算目标日期:
// 输入的周标识 weekStr = "2023-W12"; // 拆分年份和周数 splitParts = listSplit(weekStr, "-W"); targetYear = splitParts[1]; targetWeek = splitParts[2]; // 初始化Calendar,配置ISO周规则 calendar = createObject("java", "java.util.Calendar").getInstance(); calendar.setMinimalDaysInFirstWeek(4); // 第一周至少4天在当年 calendar.setFirstDayOfWeek(createObject("java", "java.util.Calendar").MONDAY); // 设置年份和周数,指定为周一 calendar.set(createObject("java", "java.util.Calendar").YEAR, targetYear); calendar.set(createObject("java", "java.util.Calendar").WEEK_OF_YEAR, targetWeek); calendar.set(createObject("java", "java.util.Calendar").DAY_OF_WEEK, createObject("java", "java.util.Calendar").MONDAY); // 转换为CFML日期并格式化 targetDate = calendar.getTime(); resultDate = dateFormat(targetDate, "yyyy-mm-dd"); writeOutput(resultDate); // 输出:2023-03-20
思路2:纯CFML原生函数计算
完全使用CFML内置函数,基于ISO周规则推导:
// 输入的周标识 weekStr = "2023-W12"; // 拆分年份和周数 splitParts = listSplit(weekStr, "-W"); targetYear = splitParts[1]; targetWeek = splitParts[2]; // 取当年1月4日(ISO第一周的基准日) jan4th = createDate(targetYear, 1, 4); // 计算1月4日的星期几(CFML中dayOfWeek返回1=周日,2=周一...7=周六) dowJan4th = dayOfWeek(jan4th); // 计算当年第一周的周一 firstWeekMonday = dateAdd("d", 2 - dowJan4th, jan4th); // 目标周的周一 = 第一周周一 + (周数-1)*7天 targetMonday = dateAdd("d", (targetWeek - 1)*7, firstWeekMonday); resultDate = dateFormat(targetMonday, "yyyy-mm-dd"); writeOutput(resultDate); // 输出:2023-03-20
内容的提问来源于stack exchange,提问作者Userx10xC
相关产品推荐
相关产品推荐

