Rails 4中m/d/yy格式日期无法通过strptime格式化求助
解决Rails中strptime解析"2/9/17"格式日期的问题
你遇到的这个ArgumentError其实是因为strptime的格式符存在跨平台兼容性问题——%-m和%-d这种用来去掉数字前导零的格式符是GNU专属的扩展(常见于Linux系统),但如果你的开发环境是macOS或者BSD系统,这些格式符是不被支持的,所以才会抛出无效日期的错误。
这里有几个简单的解决方案,帮你轻松搞定这个问题:
跨平台通用方案(最推荐):
其实strptime的%m和%d格式符本身就可以兼容带前导零和不带前导零的数字,所以你完全不需要用%-m这种平台相关的写法,直接用标准格式即可:date = "2/9/17" Date.strptime(date, "%m/%d/%y") # 返回结果:#<Date: 2017-02-09 ((2457794j,0s,0n),+0s,2299161j)>这个写法不管是在Linux还是macOS环境下都能正常工作,完美适配你的CSV日期格式。
针对macOS/BSD的特定方案:
如果你确实想明确指定“不带前导零”的格式,可以用%_m(下划线代替减号)来匹配不带前导零的月份,%_d匹配不带前导零的日期:date = "2/9/17" Date.strptime(date, "%_m/%_d/%y")不过这种写法仅限macOS/BSD系统,通用性不如第一种方案。
更省心的自动解析方案:
如果你CSV里的日期格式都是常见的短格式,也可以用Date.parse来自动识别,它能处理多种常见日期格式:date = "2/9/17" Date.parse(date) # 返回结果:#<Date: 2017-02-09 ((2457794j,0s,0n),+0s,2299161j)>注意:如果日期存在歧义(比如"9/2/17"到底是月/日/年还是日/月/年),
Date.parse会根据系统区域设置判断,所以如果你的日期格式是固定的月/日/年,还是用strptime更可靠。
内容的提问来源于stack exchange,提问作者Jeremy Thomas
相关产品推荐
相关产品推荐

