如何基于年份和周数获取一周起始日期?(DataWeave报错求助)
年份周数转对应周第一天的解决思路
报错原因解析
第一种方法里用yyyyww格式将字符串转为LocalDateTime失败,是因为LocalDateTime需要完整的日期时间维度(年、月、日、时分秒等),但仅提供年和周数的话,缺少具体的日与时间信息,无法完成解析。
可行解决方案
方案1:用LocalDate结合周规则解析
改用LocalDate(仅日期维度),并指定周的解析规则(比如一周起始日是周日还是周一),就能正确解析年+周数的字符串:
%dw 2.0 output application/json import * from dw::core::Dates var dateStr = '201601' // 自定义周规则:周日为一周第一天,周数从1开始 var customWeekRule = WeekFields.of(java.time.DayOfWeek.SUNDAY, 1) --- { weekFirstDay: dateStr as LocalDate { format: "yyyyww", weekFields: customWeekRule } }
如果遵循ISO标准(周一为一周起始),直接用WeekFields.ISO替换customWeekRule即可。
方案2:用fromWeekOfYear函数直接生成日期
DataWeave的dw::core::Dates模块提供了fromWeekOfYear函数,可直接根据年份和周数生成对应周的第一天,无需手动计算:
%dw 2.0 output application/json import * from dw::core::Dates var dateStr = '201601' var year = dateStr[0 to 3] as Number var weekNum = dateStr[4 to -1] as Number --- { weekFirstDay: fromWeekOfYear(year, weekNum) }
默认遵循ISO周规则,若要自定义起始日,传入第三个参数指定WeekFields即可:
fromWeekOfYear(year, weekNum, WeekFields.of(java.time.DayOfWeek.SUNDAY, 1))
方案3:修正手动计算逻辑
你之前的手动计算存在偏移错误(第一周无需加7天),修正后的脚本如下:
%dw 2.0 output application/json import * from dw::core::Dates var dateStr = '201601' var year = dateStr[0 to 3] as Number var weekNum = dateStr[4 to -1] as Number // 先取当年第一天,再转到当年第一周的起始日,最后加上(周数-1)*7天 var firstDayOfYear = (year as String ++ "-01-01") as Date var firstDayOfFirstWeek = atBeginningOfWeek(firstDayOfYear) --- { weekFirstDay: firstDayOfFirstWeek + days((weekNum - 1) * 7) }
注意:atBeginningOfWeek默认使用系统周规则,也可传入WeekFields自定义起始日。
内容的提问来源于stack exchange,提问作者Nazarii Lykholat
相关产品推荐
相关产品推荐

