Ruby中Date.strptime用%Y-%V-%u解析日期返回错误年份问题
问题原因及解决方法
问题根源
你传的day参数是21,但%u格式符代表的是一周中的第几天,取值范围是1(周一)到7(周日)。当strptime遇到超出有效范围的日期组件时,不会抛出错误,而是会用当前日期的对应值来替代,这就是为什么不管你传2022还是2023,返回的都是当前日期。
正确实现方式
首先要确保传入的day参数在1-7之间,然后再进行转换。如果需要处理无效输入,可以加上参数校验:
def formatted_date(year, week, day) # 校验day的有效性 raise ArgumentError, "day must be between 1 and 7" unless (1..7).cover?(day) Date.strptime("#{year}-#{week}-#{day}", '%Y-%V-%u') end
正确调用示例:
formatted_date(2022, 47, 3) # 返回2022年第47周的周三,即2022-11-23 formatted_date(2023, 47, 5) # 返回2023年第47周的周五,即2023-11-24
如果你的业务中day实际是指一年中的第几天(而非周内的天),那需要换用对应格式符%j,方法调整为:
def formatted_date(year, day_of_year) Date.strptime("#{year}-#{day_of_year}", '%Y-%j') end
此时调用formatted_date(2022, 21)会返回2022-01-21。
内容的提问来源于stack exchange,提问作者marcHoll90
相关产品推荐
相关产品推荐

