[ntp:questions] POSIX Timestamp to NTP Timestamp

Dave Hart davehart at gmail.com
Tue Sep 28 22:56:50 UTC 2010


On Tue, Sep 28, 2010 at 12:40 UTC, Matt Davis <mattdavis9 at gmail.com> wrote:
> I am having some trouble converting a POSIX UTC timestamp into a NTP timestamp.
> The former being from the epoch starting January 1, 1970 at 12AM and the latter
> being that of January 1 1900 12AM.
>
> In summary my equation is this:
>
> /* Seconds between 1970 and 1900 (with 17 leap years) */
> uint64_t epoch_difference = (365 + 17) * 24 * 60 * 60;
>
> uint64_t ntp_timestamp = (time(NULL) - epoch_difference) << 32;
>
> Unfortunately, when I interpret this value, I keep getting values in 2036.  I
> know my version of time() is from the 1970 epoch.  So I am a tad confused here.

As was said on irc.freenode.net #ntp in response to your question
there, you are subtracting when you should be adding.  There are more
seconds between now and 1900 than between now and 1970.  The NTP
reference implementation has this code ready for you to use verbatim,
liberally licensed.  See include/unixtime.h and libntp/systime.c,
particularly get_systime().  Note in particular that the reference
implementation disagrees with your code on the value of
epoch_difference (referred to as JAN_1970 in the NTP code):

#define	JAN_1970	0x83aa7e80	/* 2208988800 1970 - 1900 in seconds */

Cheers,
Dave Hart



More information about the questions mailing list