Parse Twitter-style dates
This commit is contained in:
parent
ae608d26e1
commit
441d11820d
2 changed files with 15 additions and 2 deletions
|
@ -28,6 +28,7 @@
|
||||||
-export([format_iso8601/1]).
|
-export([format_iso8601/1]).
|
||||||
-export([parse/1, parse/2]).
|
-export([parse/1, parse/2]).
|
||||||
-export([nparse/1]).
|
-export([nparse/1]).
|
||||||
|
-export([tokenise/2]).
|
||||||
|
|
||||||
%% These are used exclusively as guards and so the function like
|
%% These are used exclusively as guards and so the function like
|
||||||
%% defines make sense
|
%% defines make sense
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
-define( is_day(X), (is_integer(X) andalso X =< 31) ).
|
-define( is_day(X), (is_integer(X) andalso X =< 31) ).
|
||||||
-define( is_hinted_month(X), (is_tuple(X) andalso size(X)=:=2 andalso element(1,X)=:=?MONTH_TAG) ).
|
-define( is_hinted_month(X), (is_tuple(X) andalso size(X)=:=2 andalso element(1,X)=:=?MONTH_TAG) ).
|
||||||
-define( is_month(X), ( (is_integer(X) andalso X =< 12) orelse ?is_hinted_month(X) ) ).
|
-define( is_month(X), ( (is_integer(X) andalso X =< 12) orelse ?is_hinted_month(X) ) ).
|
||||||
|
-define( is_tz_offset(H1,H2,M1,M2), (?is_num(H1) andalso ?is_num(H2) andalso ?is_num(M1) andalso ?is_num(M2)) ).
|
||||||
|
|
||||||
-define(GREGORIAN_SECONDS_1970, 62167219200).
|
-define(GREGORIAN_SECONDS_1970, 62167219200).
|
||||||
-define(ISO_8601_DATETIME_FORMAT, "Y-m-dTG:i:sZ").
|
-define(ISO_8601_DATETIME_FORMAT, "Y-m-dTG:i:sZ").
|
||||||
|
@ -207,6 +209,11 @@ parse([Month,Day,Year,Hour,$:,Min], _Now, _Opts)
|
||||||
when ?is_hinted_month(Month) andalso ?is_day(Day) ->
|
when ?is_hinted_month(Month) andalso ?is_day(Day) ->
|
||||||
{{Year, Month, Day}, {hour(Hour, []), Min, 0}};
|
{{Year, Month, Day}, {hour(Hour, []), Min, 0}};
|
||||||
|
|
||||||
|
%% Date/Times Fri Nov 21 14:55:26 +0000 2014 (Twitter format)
|
||||||
|
parse([Month, Day, Hour,$:,Min,$:,Sec, Year], _Now, _Opts)
|
||||||
|
when ?is_hinted_month(Month), ?is_day(Day), ?is_year(Year) ->
|
||||||
|
{{Year, Month, Day}, {hour(Hour, []), Min, Sec}};
|
||||||
|
|
||||||
%% Times - 21:45, 13:45:54, 13:15PM etc
|
%% Times - 21:45, 13:45:54, 13:15PM etc
|
||||||
parse([Hour,$:,Min,$:,Sec | PAM], {Date, _Time}, _O) when ?is_meridian(PAM) ->
|
parse([Hour,$:,Min,$:,Sec | PAM], {Date, _Time}, _O) when ?is_meridian(PAM) ->
|
||||||
{Date, {hour(Hour, PAM), Min, Sec}};
|
{Date, {hour(Hour, PAM), Min, Sec}};
|
||||||
|
@ -399,6 +406,7 @@ tokenise("OF"++Rest, Acc) -> tokenise(Rest, Acc);
|
||||||
tokenise("T"++Rest, Acc) -> tokenise(Rest, Acc); % 2012-12-12T12:12:12 ISO formatting.
|
tokenise("T"++Rest, Acc) -> tokenise(Rest, Acc); % 2012-12-12T12:12:12 ISO formatting.
|
||||||
tokenise([$Z | Rest], Acc) -> tokenise(Rest, [$Z | Acc]); % 2012-12-12T12:12:12Zulu
|
tokenise([$Z | Rest], Acc) -> tokenise(Rest, [$Z | Acc]); % 2012-12-12T12:12:12Zulu
|
||||||
tokenise([$. | Rest], Acc) -> tokenise(Rest, [$. | Acc]); % 2012-12-12T12:12:12.xxxx ISO formatting.
|
tokenise([$. | Rest], Acc) -> tokenise(Rest, [$. | Acc]); % 2012-12-12T12:12:12.xxxx ISO formatting.
|
||||||
|
tokenise([$+, H1,H2,M1,M2| Rest], Acc) when ?is_tz_offset(H1,H2,M1,M2) -> tokenise(Rest, Acc); % Tue Nov 11 15:03:18 +0000 2014 Twitter format
|
||||||
tokenise([$+| Rest], Acc) -> tokenise(Rest, [$+ | Acc]); % 2012-12-12T12:12:12.xxxx+ ISO formatting.
|
tokenise([$+| Rest], Acc) -> tokenise(Rest, [$+ | Acc]); % 2012-12-12T12:12:12.xxxx+ ISO formatting.
|
||||||
|
|
||||||
tokenise([Else | Rest], Acc) ->
|
tokenise([Else | Rest], Acc) ->
|
||||||
|
@ -888,7 +896,12 @@ parse_with_days_test_() ->
|
||||||
?_assertEqual({{2008,8,22}, {6,0,0}},
|
?_assertEqual({{2008,8,22}, {6,0,0}},
|
||||||
parse("Monday 22 Aug 2008 6a", ?DATE)),
|
parse("Monday 22 Aug 2008 6a", ?DATE)),
|
||||||
?_assertEqual({{2008,8,22}, {18,35,0}},
|
?_assertEqual({{2008,8,22}, {18,35,0}},
|
||||||
parse("Mon, 22 Aug 2008 6:35 PM", ?DATE))
|
parse("Mon, 22 Aug 2008 6:35 PM", ?DATE)),
|
||||||
|
% Twitter style
|
||||||
|
?_assertEqual({{2008,8,22}, {06,35,04}},
|
||||||
|
parse("Mon Aug 22 06:35:04 +0000 2008", ?DATE)),
|
||||||
|
?_assertEqual({{2008,8,22}, {06,35,04}},
|
||||||
|
parse("Mon Aug 22 06:35:04 +0500 2008", ?DATE))
|
||||||
].
|
].
|
||||||
|
|
||||||
parse_with_TZ_test_() ->
|
parse_with_TZ_test_() ->
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
file(Filename) -> case file:read_file(Filename) of {ok,Bin} -> parse(Bin); Err -> Err end.
|
file(Filename) -> case file:read_file(Filename) of {ok,Bin} -> parse(Bin); Err -> Err end.
|
||||||
|
|
||||||
-spec parse(binary() | list()) -> any().
|
-spec parse(binary() | list()) -> any().
|
||||||
parse(List) when is_list(List) -> parse(list_to_binary(List));
|
parse(List) when is_list(List) -> parse(unicode:characters_to_binary(List));
|
||||||
parse(Input) when is_binary(Input) ->
|
parse(Input) when is_binary(Input) ->
|
||||||
_ = setup_memo(),
|
_ = setup_memo(),
|
||||||
Result = case 'semver'(Input,{{line,1},{column,1}}) of
|
Result = case 'semver'(Input,{{line,1},{column,1}}) of
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue