如何用strftime和%Z移除夏令时/标准时间标识?Rails场景
如何让Rails中strftime输出不带D/S的时区缩写(如PT而非PDT/PST)
Hey there! 先给你明确结论:没有未公开的strftime格式指令能直接输出不带D/S的"PT"。官方文档里的%Z就是用来输出对应时区的标准时/夏令时完整缩写(PST/PDT),所以咱们得通过字符串处理或者自定义逻辑来实现需求。
下面给你几个实用的解决方案:
1. 最直接快速:用gsub替换多余字符
这是最简单的实现方式,直接对strftime的输出结果做替换,去掉末尾的D或S:
代码示例
# 获取当前太平洋时区时间 time = Time.now.in_time_zone('Pacific Time (US & Canada)') # 原始strftime输出 original_output = time.strftime("%Y-%m-%d %H:%M %Z") # 处理后得到期望格式 formatted_output = original_output.gsub(/[DS]$/, '')
输出对比
- 原始输出(Original Output):
2024-05-20 14:30 PDT或2024-11-20 14:30 PST - 期望输出(Desired Output):
2024-05-20 14:30 PT
2. 更优雅:自定义Rails时间格式(适合多处复用)
如果需要在应用多个地方使用这个格式,可以在本地化文件里定义自定义格式,减少重复代码:
步骤1:在本地化文件中添加格式
编辑config/locales/en.yml(对应你的语言环境文件):
en: time: formats: pacific_time: "%Y-%m-%d %H:%M %Z"
步骤2:在代码/视图中调用并处理
# 使用I18n本地化方法格式化后再替换 I18n.l(time, format: :pacific_time).gsub(/[DS]$/, '')
如果你的应用只固定使用太平洋时区,也可以直接硬编码PT(不依赖%Z),但这种方式灵活性低:
en: time: formats: pacific_time: "%Y-%m-%d %H:%M PT"
3. 关于你的application.rb配置
如果你的Rails应用已经设置了默认时区,比如:
# config/application.rb config.time_zone = 'Pacific Time (US & Canada)' config.active_record.default_timezone = :local # 或:utc,根据业务需求调整
上面的所有方案都能正常工作,因为时间对象会自动使用你配置的默认时区。
补充说明
之所以没有直接的strftime指令,是因为PT并不是IANA时区数据库中的标准缩写——标准的太平洋时区缩写就是区分夏令时(PDT)和标准时(PST)的,所以官方没有提供跳过D/S的指令,只能通过自定义处理来实现。
内容的提问来源于stack exchange,提问作者danielricecodes
相关产品推荐
相关产品推荐

