Ruby中带毫秒的Time对象生成及ISO8601格式转换问题
问题原因与解决方案
问题根源
Time.utc方法的最后一个参数接收的是微秒(1秒=1,000,000微秒),你传入的100仅代表0.1毫秒,不足1毫秒,因此输出时会被截断为000,导致毫秒信息丢失。
正确实现方式
1. 传入正确的微秒值
要表示100毫秒,需要传入100 * 1000 = 100000微秒:
Time.utc(2022, 10, 1, 22, 38, 45, 100000).in_time_zone.iso8601(3) # 输出:"2022-10-01T22:38:45.100Z"
2. 直接解析带毫秒的字符串(更直观)
如果不需要拆分时间分量,用Time.parse直接构造目标时间:
Time.parse("2022-10-01T22:38:45.100Z").iso8601(3) # 输出:"2022-10-01T22:38:45.100Z"
3. Rails环境下的简化写法
如果是Rails项目,可借助ActiveSupport的时区方法:
ActiveSupport::TimeZone['UTC'].parse("2022-10-01 22:38:45.100").iso8601(3) # 输出:"2022-10-01T22:38:45.100Z"
内容的提问来源于stack exchange,提问作者nanakondor
相关产品推荐
相关产品推荐

