Skip to content

Instantly share code, notes, and snippets.

@mweibel
Created November 21, 2012 08:28
Show Gist options
  • Save mweibel/4123802 to your computer and use it in GitHub Desktop.
Save mweibel/4123802 to your computer and use it in GitHub Desktop.
ISO8601 to unix timestamp
-module(iso8601_to_unixtimestamp).
-define(GREGORIAN_SECONDS_TO_UNIXTIMESTAMP_DIFFERENCE, 719528*24*3600).
-export([doit/0]).
parse_iso8601(DateString) ->
{ok,[Year, Month, Day, Hour, Min, Sec],_} = io_lib:fread("~d-~d-~dT~d:~d:~dZ", DateString),
{{Year,Month,Day},{Hour,Min,Sec}}.
ymdhms_to_gregorian_seconds({{Year,Month,Day},{Hour,Min,Sec}}) ->
calendar:datetime_to_gregorian_seconds({{Year,Month,Day},{Hour,Min,Sec}}).
gregorian_seconds_to_unixtimestamp(Seconds) ->
Seconds - ?GREGORIAN_SECONDS_TO_UNIXTIMESTAMP_DIFFERENCE.
convert_unixtimestamp_to_timestamp(UnixTimestamp) ->
{UnixTimestamp div 1000000000000,
UnixTimestamp div 1000000 rem 1000000,
UnixTimestamp rem 1000000}.
timestamp_to_unixtimestamp({MegaSecs, Secs, MicroSecs}) ->
MegaSecs * 1000000 * 1000000 + Secs * 1000000 + MicroSecs.
doit() ->
ISO8601 = "2012-11-21T09:00:00Z",
io:fwrite("ISO8601: ~s~n", [ISO8601]),
DateTime = parse_iso8601(ISO8601),
io:fwrite("DateTime: ~p~n", [DateTime]),
GregorianSeconds = ymdhms_to_gregorian_seconds(DateTime),
io:fwrite("GregorianSeconds: ~p~n", [GregorianSeconds]),
UnixTimestamp = gregorian_seconds_to_unixtimestamp(GregorianSeconds),
io:fwrite("UnixTimestamp: ~p~n", [UnixTimestamp]),
Timestamp = convert_unixtimestamp_to_timestamp(UnixTimestamp),
io:fwrite("Timestamp: ~p~n", [Timestamp]),
UnixTimestamp2 = timestamp_to_unixtimestamp(Timestamp),
io:fwrite("UnixTimestamp2: ~p~n", [UnixTimestamp2]),
UnixTimestamp =:= UnixTimestamp2.
@mweibel
Copy link
Author

mweibel commented Nov 21, 2012

1> iso8601_to_unixtimestamp:doit().
ISO8601: 2012-11-21T09:00:00Z
DateTime: {{2012,11,21},{9,0,0}}
GregorianSeconds: 63520707600
UnixTimestamp: 1353488400
Timestamp: {0,1353,488400}
UnixTimestamp2: 1353488400
true
2>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment