Ruby:将带时间的日期字符串转为YYYY-MM-DD格式时遇无效日期错误
解决Ruby日期字符串转换无效日期错误
你的问题出在格式字符串的占位符使用错误,导致无法匹配目标日期字符串,具体问题点和修复方案如下:
错误原因
- 你用了
%M占位符,但它代表的是分钟,而你需要匹配的是月份全称(如December),正确的月份全称占位符是%B; %i不是有效的日期/时间占位符,分钟的正确占位符是%M;- 时间部分的分隔符是
.,格式字符串里需要对应这个符号,不能用错误的占位符替代。
修复方案
方案1:仅提取日期部分(推荐,因为你只需要YYYY-MM-DD)
直接匹配日期字符串中的日期部分,忽略时间:
current_date = "December 21, 2022 04.00 AM" # 正确的日期格式字符串 date_format = "%B %e, %Y" # 转换为Date对象并输出YYYY-MM-DD格式 new_date = Date.strptime(current_date, date_format).iso8601 # 输出结果:"2022-12-21"
方案2:先处理完整带时间的字符串
如果需要先解析完整的时间字符串,使用DateTime类更稳妥(Date类主要处理日期,对带时间的字符串支持有限):
require 'date' current_date = "December 21, 2022 04.00 AM" # 正确的带时间格式字符串 date_format_time = "%B %e, %Y %l.%M %p" # 解析为DateTime后转成Date,再输出目标格式 new_date = DateTime.strptime(current_date, date_format_time).to_date.iso8601 # 输出结果:"2022-12-21"
关键占位符说明
%B:月份全称(如January、December)%e:月份中的日期(1-31,带前导空格)%Y:4位年份%l:12小时制的小时(1-12,带前导空格)%M:分钟(00-59)%p:AM/PM标识
内容的提问来源于stack exchange,提问作者user20940255
相关产品推荐
相关产品推荐

