Skip to content

Instantly share code, notes, and snippets.

@5HT
Created February 17, 2015 00:27
Show Gist options
  • Save 5HT/c06d3ad573a458bb818d to your computer and use it in GitHub Desktop.
Save 5HT/c06d3ad573a458bb818d to your computer and use it in GitHub Desktop.
-module(iso8601).
-compile(export_all).
-define(ISO_8601_DATETIME_FORMAT, "Y-m-dTG:i:sZ").
-define(ISO_8601_DATETIME_WITH_MS_FORMAT, "Y-m-dTG:i:s.fZ").
format(Format) -> format(Format, calendar:universal_time(),[]).
format(Format, {_,_,Ms}=Now) -> {Date,{H,M,S}} = calendar:now_to_datetime(Now), format(Format, {Date, {H,M,S,Ms}}, []);
format(Format, Date) -> format(Format, Date, []).
format_iso8601({{_,_,_},{_,_,_}}=Date) -> format(?ISO_8601_DATETIME_FORMAT, Date);
format_iso8601({{_,_,_},{_,_,_,_}}=Date) -> format(?ISO_8601_DATETIME_WITH_MS_FORMAT, Date).
format([], _Date, Acc) -> lists:flatten(lists:reverse(Acc));
format([$Y|T], {{Y,_,_},_}=Dt, Acc) -> format(T, Dt, [itol(Y)|Acc]);
format([$m|T], {{_,M,_},_}=Dt, Acc) -> format(T, Dt, [pad2(M)|Acc]);
format([$d|T], {{_,_,D},_}=Dt, Acc) -> format(T, Dt, [pad2(D)|Acc]);
format([$D|T], {Date,_}=Dt, Acc) -> format(T, Dt, [sdayd(Date)|Acc]);
format([$G|T], {_,{H,_,_,_}}=Dt, Acc) -> format(T, Dt, [itol(H)|Acc]);
format([$i|T], {_,{_,M,_,_}}=Dt, Acc) -> format(T, Dt, [pad2(M)|Acc]);
format([$s|T], {_,{_,_,S,_}}=Dt, Acc) -> format(T, Dt, [pad2(S)|Acc]);
format([$f|T], {_,{_,_,_,Ms}}=Dt, Acc) -> format(T, Dt, [itol(Ms)|Acc]);
format([H|T], Date, Acc) -> format(T, Date, [H|Acc]).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment