Skip to content

Commit 1255d8c

Browse files
authored
Add support for RFC 3339 style time (#248)
fix #247 ISO 8601 uses "T" for separator of date and time. RFC 3339 also accepts a space for separator of date and time.
1 parent 698d1fa commit 1255d8c

File tree

2 files changed

+86
-3
lines changed

2 files changed

+86
-3
lines changed

lib/csv.rb

+2-3
Original file line numberDiff line numberDiff line change
@@ -872,10 +872,9 @@ def initialize(message, line_number)
872872
# A Regexp used to find and convert some common DateTime formats.
873873
DateTimeMatcher =
874874
/ \A(?: (\w+,?\s+)?\w+\s+\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},?\s+\d{2,4} |
875-
\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2} |
876-
# ISO-8601
875+
# ISO-8601 and RFC-3339 (space instead of T) recognized by DateTime.parse
877876
\d{4}-\d{2}-\d{2}
878-
(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)?
877+
(?:[T\s]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)?
879878
)\z /x
880879

881880
# The encoding used by all converters.

test/csv/test_data_converters.rb

+84
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,88 @@ def test_builtin_date_time_converter_iso8601_utc
103103
assert_equal(datetime,
104104
CSV::Converters[:date_time][iso8601_string])
105105
end
106+
107+
def test_builtin_date_time_converter_rfc3339_minute
108+
rfc3339_string = "2018-01-14 22:25"
109+
datetime = DateTime.new(2018, 1, 14, 22, 25)
110+
assert_equal(datetime,
111+
CSV::Converters[:date_time][rfc3339_string])
112+
end
113+
114+
def test_builtin_date_time_converter_rfc3339_second
115+
rfc3339_string = "2018-01-14 22:25:19"
116+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
117+
assert_equal(datetime,
118+
CSV::Converters[:date_time][rfc3339_string])
119+
end
120+
121+
def test_builtin_date_time_converter_rfc3339_under_second
122+
rfc3339_string = "2018-01-14 22:25:19.1"
123+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1)
124+
assert_equal(datetime,
125+
CSV::Converters[:date_time][rfc3339_string])
126+
end
127+
128+
def test_builtin_date_time_converter_rfc3339_under_second_offset
129+
rfc3339_string = "2018-01-14 22:25:19.1+09:00"
130+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9")
131+
assert_equal(datetime,
132+
CSV::Converters[:date_time][rfc3339_string])
133+
end
134+
135+
def test_builtin_date_time_converter_rfc3339_offset
136+
rfc3339_string = "2018-01-14 22:25:19+09:00"
137+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9")
138+
assert_equal(datetime,
139+
CSV::Converters[:date_time][rfc3339_string])
140+
end
141+
142+
def test_builtin_date_time_converter_rfc3339_utc
143+
rfc3339_string = "2018-01-14 22:25:19Z"
144+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
145+
assert_equal(datetime,
146+
CSV::Converters[:date_time][rfc3339_string])
147+
end
148+
149+
def test_builtin_date_time_converter_rfc3339_tab_minute
150+
rfc3339_string = "2018-01-14\t22:25"
151+
datetime = DateTime.new(2018, 1, 14, 22, 25)
152+
assert_equal(datetime,
153+
CSV::Converters[:date_time][rfc3339_string])
154+
end
155+
156+
def test_builtin_date_time_converter_rfc3339_tab_second
157+
rfc3339_string = "2018-01-14\t22:25:19"
158+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
159+
assert_equal(datetime,
160+
CSV::Converters[:date_time][rfc3339_string])
161+
end
162+
163+
def test_builtin_date_time_converter_rfc3339_tab_under_second
164+
rfc3339_string = "2018-01-14\t22:25:19.1"
165+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1)
166+
assert_equal(datetime,
167+
CSV::Converters[:date_time][rfc3339_string])
168+
end
169+
170+
def test_builtin_date_time_converter_rfc3339_tab_under_second_offset
171+
rfc3339_string = "2018-01-14\t22:25:19.1+09:00"
172+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19.1, "+9")
173+
assert_equal(datetime,
174+
CSV::Converters[:date_time][rfc3339_string])
175+
end
176+
177+
def test_builtin_date_time_converter_rfc3339_tab_offset
178+
rfc3339_string = "2018-01-14\t22:25:19+09:00"
179+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19, "+9")
180+
assert_equal(datetime,
181+
CSV::Converters[:date_time][rfc3339_string])
182+
end
183+
184+
def test_builtin_date_time_converter_rfc3339_tab_utc
185+
rfc3339_string = "2018-01-14\t22:25:19Z"
186+
datetime = DateTime.new(2018, 1, 14, 22, 25, 19)
187+
assert_equal(datetime,
188+
CSV::Converters[:date_time][rfc3339_string])
189+
end
106190
end

0 commit comments

Comments
 (0)