summaryrefslogtreecommitdiff
path: root/spec/ruby/core/time/strftime_spec.rb
blob: 4cb300c916189a2fb55e3008641f8e7f44c3ed10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# encoding: utf-8

require_relative '../../spec_helper'
require_relative '../../shared/time/strftime_for_date'
require_relative '../../shared/time/strftime_for_time'

describe "Time#strftime" do
  before :all do
    @new_date = -> y, m, d { Time.gm(y,m,d) }
    @new_time = -> *args { Time.gm(*args) }
    @new_time_in_zone = -> zone, offset, *args {
      with_timezone(zone, offset) do
        Time.new(*args)
      end
    }
    @new_time_with_offset = -> y, m, d, h, min, s, offset {
      Time.new(y,m,d,h,min,s,offset)
    }

    @time = @new_time[2001, 2, 3, 4, 5, 6]
  end

  it_behaves_like :strftime_date, :strftime
  it_behaves_like :strftime_time, :strftime

  # Differences with date
  it "requires an argument" do
    -> { @time.strftime }.should raise_error(ArgumentError)
  end

  # %Z is zone name or empty for Time
  it "should be able to show the timezone if available" do
    @time.strftime("%Z").should == @time.zone
    with_timezone("UTC", 0) do
      Time.gm(2000).strftime("%Z").should == "UTC"
    end

    Time.new(2000, 1, 1, 0, 0, 0, 42).strftime("%Z").should == ""
  end

  # %v is %e-%^b-%Y for Time
  it "should be able to show the commercial week" do
    @time.strftime("%v").should == " 3-FEB-2001"
    @time.strftime("%v").should == @time.strftime('%e-%^b-%Y')
  end

  # Date/DateTime round at creation time, but Time does it in strftime.
  it "rounds an offset to the nearest second when formatting with %z" do
    time = @new_time_with_offset[2012, 1, 1, 0, 0, 0, Rational(36645, 10)]
    time.strftime("%::z").should == "+01:01:05"
  end

  ruby_version_is "3.1" do
    it "supports RFC 3339 UTC for unknown offset local time, -0000, as %-z" do
      time = Time.gm(2022)

      time.strftime("%z").should == "+0000"
      time.strftime("%-z").should == "-0000"
      time.strftime("%-:z").should == "-00:00"
      time.strftime("%-::z").should == "-00:00:00"
    end

    it "applies '-' flag to UTC time" do
      time = Time.utc(2022)
      time.strftime("%-z").should == "-0000"

      time = Time.gm(2022)
      time.strftime("%-z").should == "-0000"

      time = Time.new(2022, 1, 1, 0, 0, 0, "Z")
      time.strftime("%-z").should == "-0000"

      time = Time.new(2022, 1, 1, 0, 0, 0, "-00:00")
      time.strftime("%-z").should == "-0000"

      time = Time.new(2022, 1, 1, 0, 0, 0, "+03:00").utc
      time.strftime("%-z").should == "-0000"
    end

    it "ignores '-' flag for non-UTC time" do
      time = Time.new(2022, 1, 1, 0, 0, 0, "+03:00")
      time.strftime("%-z").should == "+0300"
    end

    it "works correctly with width, _ and 0 flags, and :" do
      Time.now.utc.strftime("%-_10z").should == "      -000"
      Time.now.utc.strftime("%-10z").should == "-000000000"
      Time.now.utc.strftime("%-010:z").should == "-000000:00"
      Time.now.utc.strftime("%-_10:z").should == "     -0:00"
      Time.now.utc.strftime("%-_10::z").should == "  -0:00:00"
    end
  end
end