Converting Between struct:time and ISO8601 Format

From Erlang Community

Revision as of 06:38, 9 March 2007 by Bfulgham (Talk | contribs)
(diff) ←Older revision | Current revision (diff) | Newer revision→ (diff)

[edit] Problem

You have an application that requires you to use ISO-8601 Format for input and output.

[edit] Solution

Unfortunately, no Erlang libraries provide this functionality. Luckily, the native Erlang date and time formats are very easy to format for display or transmission, even in ISO-8061 format:

iso_8601_fmt(DateTime) ->
    {{Year,Month,Day},{Hour,Min,Sec}} = DateTime,
    io_lib:format("~4.10.0B-~2.10.0B-~2.10.0B ~2.10.0B:~2.10.0B:~2.10.0B",
        [Year, Month, Day, Hour, Min, Sec]).

1> CurrDateTime = erlang:localtime().
{{2004,8,28},{1,19,37}}
2> {{Year,Month,Day},{Hour,Min,Sec}} = CurrDateTime.
{{2004,8,28},{1,19,37}}
3> io:fwrite("~s\n",[iso_8601_fmt(erlang:localtime())]).
2004-08-28 01:48:48

However, if you're writing a web application, you may need to observe the W3C profile for time formats, which is slightly different. See the RFC1123_Dates_and_Times Recipe for details.

The nice thing about the W3C profile of the ISO 8601 format is that it's very easy to sort dates using a simple string compare.

Erlang/OTP Projects
Personal tools