Ruby中如何创建不带时区的UTC日期时间并输出指定格式
Ruby 输出无时区标识UTC时间的实现方法
你当前运行代码得到2019-01-01T00:00:00+00:00是DateTime默认转字符串方法的输出规则,时间值本身已经是正确的UTC时间,只需要调整格式化逻辑就能得到2019-01-01 00:00:00格式的结果,另外你原有代码存在一处API用法错误。
最简实现
直接调用时间对象的strftime方法,指定你需要的输出格式即可:
require 'time' # 注意:DateTime.parse 不接收格式串作为第二个参数,你原来写的"yyyy-mm-dd hh:mm:ss"是无效传参 utc = DateTime.parse("2019-01-01 00:00:00") puts utc.strftime("%Y-%m-%d %H:%M:%S")
运行后输出结果就是目标格式2019-01-01 00:00:00。
其他生成UTC时间的方式
如果不需要从字符串解析,也可以直接用Time.utc构造UTC时间对象,再格式化输出:
# 按顺序传入年、月、日、时、分、秒参数,直接生成UTC时区时间 utc_time = Time.utc(2019, 1, 1, 0, 0, 0) puts utc_time.strftime("%Y-%m-%d %H:%M:%S")
常见注意点
- Ruby的时间格式化占位符和你写的
yyyy-mm-dd格式不同,常用占位符对应关系:%Y:4位年份%m:补零的2位月份%d:补零的2位日期%H:24小时制补零小时%M:补零分钟%S:补零秒
- 如果需要严格按照指定格式解析时间字符串,不要用
parse方法,改用strptime传入格式串:utc = DateTime.strptime("2019-01-01 00:00:00", "%Y-%m-%d %H:%M:%S") - Ruby标准库的
DateTime、Time类都会存储时区偏移信息,不存在完全不携带时区属性的时间对象。你需要的“不带时区”属于展示层需求,只要在输出、序列化时不打印时区字段即可,底层存储的UTC时间值不会出错。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

