[erlang-questions] Working with dates.

Per Hedeland <>
Mon Jul 16 11:58:47 CEST 2007


"Ben Hood" <> wrote:
>
>-define(MegaSeconds, 1000000000).
>-define(Seconds, 1000).
>-define(MicroSeconds, 1000).

Maybe those should rather be

-define(MilliSecondsPerMegaSecond, 1000000000).
-define(MilliSecondsPerSecond, 1000).
-define(MicroSecondsPerMilliSecond, 1000).

?:-)

>-define(UnixEpoch, 62167219200).

(I.e. the value returned by
calendar:datetime_to_gregorian_seconds({{1970,1,1},{0,0,0}}).)

>encode_timestamp({MegaSecs, Secs, MicroSecs}) ->
>    MegaSecs * ?MegaSeconds + Secs * ?Seconds + MicroSecs / ?MicroSeconds.

Well, this turns what is apparently an erlang:now() value into
milliseconds as a floating-point number - I don't know of any Unix
timestamps that are expressed as milliseconds, whether floating-point or
integer... To get a time() timestamp, it would just be

encode_timestamp({MegaSecs, Secs, _MicroSecs}) ->
    MegaSecs * 1000000 + Secs.

(And if you want integer milliseconds, use 'div' instead of '/'.)

>encode_localtime(DateTime={{Year,Month,Day},{Hour,Min,Sec}}) ->
>    [Universal] = calendar:local_time_to_universal_time_dst(DateTime),
>    Seconds = calendar:datetime_to_gregorian_seconds(Universal),
>    (Seconds - ?UnixEpoch) * 1000.

This will be integer milliseconds - to get time() stamp, just drop the
'* 1000'.

--Per Hedeland



More information about the erlang-questions mailing list