Skip to content

Instantly share code, notes, and snippets.

@sinkovsky
Created October 18, 2009 13:22
Show Gist options
  • Save sinkovsky/212681 to your computer and use it in GitHub Desktop.
Save sinkovsky/212681 to your computer and use it in GitHub Desktop.
вот так
parse_iso8601(Time) when is_list(Time) ->
parse_iso8601(list_to_binary(Time));
parse_iso8601(Time) when is_binary(Time) ->
parse_date(Time,{},parse_year).
parse_date(<<Year:32/bitstring, Rest/bitstring>>, Acc, parse_year) ->
parse_date(Rest, {Acc, Year}, parse_month);
parse_date(<<Month:16/bitstring, Rest/bitstring>>, Acc, parse_month) ->
parse_date(Rest, {Acc, Month}, parse_day);
parse_date(<<Day:16/bitstring, Rest/bitstring>>, Acc, parse_day) ->
parse_date(Rest,{ Acc, Day}, parse_hour);
parse_date(<<"-", Rest/bitstring>>, Acc, State) ->
parse_date(Rest, Acc, State);
parse_date(<<":", Rest/bitstring>>, Acc, State) ->
parse_date(Rest, Acc, State);
parse_date(<<" ", Rest/bitstring>>, Acc, _State) ->
parse_date(Rest, Acc, parse_hour);
parse_date(<<"T", Rest/bitstring>>, Acc, _State) ->
parse_date(Rest, Acc, parse_hour);
parse_date(<<Hour:16/bitstring, Rest/bitstring>>, Acc, parse_hour) ->
parse_date(Rest, {Acc, Hour}, parse_minute);
parse_date(<<Minute:16/bitstring, Rest/bitstring>>, Acc, parse_minute) ->
parse_date(Rest, {Acc, Minute}, parse_second);
parse_date(<<Second:16/bitstring, Rest/bitstring>>, Acc, parse_second) ->
parse_date(Rest, {Acc, Second}, parse_fraction);
parse_date(<<".", Rest/bitstring>>, Acc, parse_fraction) ->
parse_date(Rest, Acc, parse_fraction);
%% parsing fraction by parts, cause we don't know its length
parse_date(<<C:1/bitstring, Rest/bitstring>>, Acc, parse_fraction) ->
parse_date(Rest, {Acc, C}, parse_fraction);
parse_date(<<"+", Rest/bitstring>>, Acc, _State) ->
parse_date(Rest, Acc, parse_tz_hour);
parse_date(<<"-", Rest/bitstring>>, Acc, _State) ->
parse_date(Rest, Acc, parse_tz_hour);
parse_date(<<Tzhour:16/bitstring, Rest/bitstring>>, Acc, parse_tz_hour) ->
parse_date(Rest, {Acc, Tzhour}, parse_tz_minute);
parse_date(<<Tzmin:16/bitstring,Rest/bitstring>>, Acc, parse_tz_minute) ->
parse_date(Rest, {Acc, Tzmin}, finish);
parse_date(_Rest, Acc, finish) ->
Acc.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment