Skip to content

Commit 600ca02

Browse files
DocXJosé Valim
authored andcommitted
Fix DateTime.from_iso8601/2 when offset has no colon
Signed-off-by: José Valim <[email protected]>
1 parent 241e13d commit 600ca02

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

lib/elixir/lib/calendar/iso.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,14 @@ defmodule Calendar.ISO do
240240
do: parse_offset(1, hour, min, rest)
241241
def parse_offset(<<?-, hour::2-bytes, ?:, min::2-bytes, rest::binary>>),
242242
do: parse_offset(-1, hour, min, rest)
243+
def parse_offset(<<?+, hour::2-bytes, min::2-bytes, rest::binary>>),
244+
do: parse_offset(1, hour, min, rest)
245+
def parse_offset(<<?-, hour::2-bytes, min::2-bytes, rest::binary>>),
246+
do: parse_offset(-1, hour, min, rest)
247+
def parse_offset(<<?+, hour::2-bytes, rest::binary>>),
248+
do: parse_offset(1, hour, "00", rest)
249+
def parse_offset(<<?-, hour::2-bytes, rest::binary>>),
250+
do: parse_offset(-1, hour, "00", rest)
243251
def parse_offset(_),
244252
do: :error
245253

lib/elixir/test/elixir/calendar_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,36 @@ defmodule DateTimeTest do
163163
assert DateTime.compare(datetime1, datetime2) == :lt
164164
assert DateTime.compare(datetime2, datetime1) == :gt
165165
end
166+
167+
test "from_iso8601/1 with tz offsets" do
168+
assert DateTime.from_iso8601("2017-06-02T14:00:00+01:00") |> elem(1) ==
169+
%DateTime{year: 2017, month: 6, day: 2, zone_abbr: "UTC",
170+
hour: 13, minute: 0, second: 0, microsecond: {0, 0},
171+
utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
172+
173+
assert DateTime.from_iso8601("2017-06-02T14:00:00-04:00") |> elem(1) ==
174+
%DateTime{year: 2017, month: 6, day: 2, zone_abbr: "UTC",
175+
hour: 18, minute: 0, second: 0, microsecond: {0, 0},
176+
utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
177+
178+
assert DateTime.from_iso8601("2017-06-02T14:00:00+0100") |> elem(1) ==
179+
%DateTime{year: 2017, month: 6, day: 2, zone_abbr: "UTC",
180+
hour: 13, minute: 0, second: 0, microsecond: {0, 0},
181+
utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
182+
183+
assert DateTime.from_iso8601("2017-06-02T14:00:00-0400") |> elem(1) ==
184+
%DateTime{year: 2017, month: 6, day: 2, zone_abbr: "UTC",
185+
hour: 18, minute: 0, second: 0, microsecond: {0, 0},
186+
utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
187+
188+
assert DateTime.from_iso8601("2017-06-02T14:00:00+01") |> elem(1) ==
189+
%DateTime{year: 2017, month: 6, day: 2, zone_abbr: "UTC",
190+
hour: 13, minute: 0, second: 0, microsecond: {0, 0},
191+
utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
192+
193+
assert DateTime.from_iso8601("2017-06-02T14:00:00-04") |> elem(1) ==
194+
%DateTime{year: 2017, month: 6, day: 2, zone_abbr: "UTC",
195+
hour: 18, minute: 0, second: 0, microsecond: {0, 0},
196+
utc_offset: 0, std_offset: 0, time_zone: "Etc/UTC"}
197+
end
166198
end

0 commit comments

Comments
 (0)