Ruby中DateTime格式化报错:无效日期问题求助
解决12小时制日期字符串转UTC标准格式的问题
我之前也踩过类似的日期解析坑,核心问题就是没用到匹配12小时制的格式符去解析原始字符串,再加上时区转换的细节没处理到位。下面一步步帮你搞定:
第一步:正确解析原始12小时制字符串
你的原始日期格式是MM/DD/YYYY hh:mm PM/AM,对应的Ruby格式符是%m/%d/%Y %I:%M %p,这里几个关键格式符要记牢:
%I:专门对应12小时制的小时(01-12),如果误用%H(24小时制小时),直接就会触发无效日期错误%p:匹配AM/PM标识(大小写都兼容)%m/%d/%Y分别对应两位月份、两位日期、四位年份
第二步:转换为UTC时区并格式化目标格式
目标格式是YYYY-MM-DD HH:MM:00 +0000,对应的格式符是%Y-%m-%d %H:%M:00 %z:
%H:24小时制的小时(00-23),用来输出目标的24小时制时间%z:时区偏移,+0000就是UTC时区的标识
纯Ruby实现代码
require 'date' # 获取原始参数 original_time_str = params[:job][:start] # 示例值:"02/22/2018 5:20 PM" # 1. 解析原始字符串(默认按系统本地时区解析) parsed_time = DateTime.strptime(original_time_str, "%m/%d/%Y %I:%M %p") # 2. 转换为UTC时区 utc_time = parsed_time.utc # 3. 格式化为目标格式 formatted_time = utc_time.strftime("%Y-%m-%d %H:%M:00 %z") # 输出示例:"2018-02-22 22:20:00 +0000"(假设原时区为UTC-5)
Rails环境下简化实现(借助ActiveSupport)
如果是在Rails项目里,代码可以更简洁:
original_time_str = params[:job][:start] formatted_time = Time.strptime(original_time_str, "%m/%d/%Y %I:%M %p").utc.strftime("%Y-%m-%d %H:%M:00 %z")
额外注意:指定原时间的时区
如果你的原始时间不是系统本地时区(比如用户输入的是美国东部时间),一定要明确指定时区解析,避免转换错误:
require 'tzinfo' # 指定原时间所在时区(比如美国东部时区) source_timezone = TZInfo::Timezone.get('America/New_York') parsed_time = source_timezone.strptime(original_time_str, "%m/%d/%Y %I:%M %p") utc_time = parsed_time.utc formatted_time = utc_time.strftime("%Y-%m-%d %H:%M:00 %z")
这样处理后,就不会再触发无效日期错误,同时能准确得到你需要的UTC标准格式啦!
内容的提问来源于stack exchange,提问作者Cannon Moyer
相关产品推荐
相关产品推荐

