【问题标题】:Convert 24 integer to 12 hour with am/pm使用 am/pm 将 24 整数转换为 12 小时
【发布时间】:2013-02-26 01:13:06
【问题描述】:

我正在使用红宝石。

我正在尝试弄清楚如何转换以下内容..

14 变为 2 pm

0 变为 12 am

23 变为 11 pm

谢谢!

【问题讨论】:

  • 我认为您可以使用 3 个条件语句来做到这一点:if int == 0if int > 12elseif。我觉得它会更可靠,并且可以根据您的需求进行定制。
  • 什么是2 pm?那是时间对象还是字符串还是什么?
  • 只是一个字符串,不需要是时间或日期对象。
  • 我正在存储一个相当于“发送报告的时间”的列。它只需要 0-23 小时,但这在前端很难看。不过,我想不出更好的方法来做到这一点,我愿意接受建议。我计划将其存储为 24 小时整数
  • 当您提出问题时,我们希望您提供显示您尝试解决问题的源代码。这样我们就有证据证明你不是在寻找答案。

标签: ruby date datetime time


【解决方案1】:
[14, 0, 23].map { |hour| Time.parse("#{hour}:00").strftime("%l %P") }
=> [" 2 pm", "12 am", "11 pm"]

【讨论】:

    【解决方案2】:

    我喜欢@Mori 的回答,因为它让 Time 完成繁重的工作,但使用 Benchmark 我们可以看到哪个 CPU 最密集:

    这是我写的:

    def am_pm(hour)
      meridian = (hour >= 12) ? 'pm' : 'am'
      hour = case hour
            when 0, 12
              12
            when 13 .. 23
              hour - 12
            else
              hour
            end
    
      "#{ hour } #{ meridian }"
    end
    

    基准测试:

    require 'benchmark'
    require 'time'
    
    def mori(hour)
      Time.parse("#{hour}:00").strftime("%l %P")
    end
    
    def convert h
      p, l = h.divmod(12)
      "#{l.zero? ? 12 : l} #{p.zero? ? "a" : "p"}m"
    end
    
    def am_pm(hour)
      meridian = (hour >= 12) ? 'pm' : 'am'
      hour = case hour
            when 0, 12
              12
            when 13 .. 23
              hour - 12
            else
              hour
            end
    
      "#{ hour } #{ meridian }"
    end
    
    def hour_24_to_12(hour_24)
      hour_12 = hour_24 - 12
    
      if hour_12 == 0
        return "12 pm"
      elsif hour_12 == -12
        return "12 am"
      elsif hour_12 > 0
        return "#{hour_12} pm"
      elsif hour_12 < 0
        return "#{hour_24} am"
      else
        # The passed-in time is outside the range o 0-23,
        # so you may need to deal with this however you
        # feel is appropriate
      end
    end
    
    HRS = [0, 14, 23]
    N = 100_000
    
    puts RUBY_VERSION
    
    HRS.each { |hr| puts "am_pm:         #{ am_pm(hr)         }" }
    HRS.each { |hr| puts "convert:       #{ convert(hr)       }" }
    HRS.each { |hr| puts "hour_24_to_12: #{ hour_24_to_12(hr) }" }
    HRS.each { |hr| puts "mori:          #{ mori(hr)          }" }
    
    Benchmark.bm(13) do |b|
      b.report('am_pm')         { N.times { HRS.each { |h| am_pm(h)         } } }
      b.report('convert')       { N.times { HRS.each { |h| convert(h)       } } }
      b.report('hour_24_to_12') { N.times { HRS.each { |h| hour_24_to_12(h) } } }
      b.report('mori')          { N.times { HRS.each { |h| mori(h)          } } }
    end
    

    哪些输出:

    1.9.3
    am_pm:         12 am
    am_pm:         2 pm
    am_pm:         11 pm
    convert:       12 am
    convert:       2 pm
    convert:       11 pm
    hour_24_to_12: 12 am
    hour_24_to_12: 2 pm
    hour_24_to_12: 11 pm
    mori:          12 am
    mori:           2 pm
    mori:          11 pm
                        user     system      total        real
    am_pm           1.230000   0.000000   1.230000 (  1.228159)
    convert         1.280000   0.000000   1.280000 (  1.286672)
    hour_24_to_12   0.640000   0.000000   0.640000 (  0.642993)
    mori           20.940000   0.020000  20.960000 ( 21.003620)
    

    同样的测试只在 Ruby 2.0-p0 下运行:

    2.0.0
    am_pm:         12 am
    am_pm:         2 pm
    am_pm:         11 pm
    convert:       12 am
    convert:       2 pm
    convert:       11 pm
    hour_24_to_12: 12 am
    hour_24_to_12: 2 pm
    hour_24_to_12: 11 pm
    mori:          12 am
    mori:           2 pm
    mori:          11 pm
                        user     system      total        real
    am_pm           0.440000   0.000000   0.440000 (  0.433303)
    convert         0.410000   0.000000   0.410000 (  0.412183)
    hour_24_to_12   0.200000   0.000000   0.200000 (  0.201894)
    mori            9.910000   0.010000   9.920000 (  9.921940)
    

    【讨论】:

      【解决方案3】:
      def convert h
        p, l = h.divmod(12)
        "#{l.zero? ? 12 : l} #{p.zero? ? "a" : "p"}m"
      end
      convert(14) # => "2 pm"
      convert(0)  # => "12 am"
      convert(23) # => "11 pm"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        相关资源
        最近更新 更多