First, I think you need to decide if you want to deal with the issue that the C standard leaves the meaning of time_t
overly vague (it's not necessarily represented in seconds and doesn't even have any meaningful numerical properties like order/comparison). This is contrary to the behavior of every existing and historical implementation, where time_t
is in seconds. Both C and POSIX also allow time_t
to be a floating point type; as far as I know, no implementations make use of this, and on POSIX it would be rather harmful since the value of time_t
has to be an integer the way it's used in struct timespec
, etc.
If you decide you're happy assuming time_t
is always an integral number of seconds since the epoch, i.e. the values are meaningful for interchange between systems, then it's just a matter of formatting them. The safest thing to do would be to simply cast to a integer type that's large enough to store any meaningful value and that's the same size on all systems: that would be int64_t
. Then use whatever normal means you use for serializing int64_t
in a way that's immune to endian differences.
If on the other hand you want to be "absolutely" portable, you should compute your own time_t
value for "the epoch" (either the standard one or your own choice of epoch), then use difftime
to convert to a double representing "seconds since the epoch", and format the double
with snprintf(buf, sizeof buf, "%.0f", diff)
. Note that computing a time_t
value for the epoch in portable C is actually quite difficult because most of the standard functions work in local time, whereas you need universal time. There are tricks you can do with the gmtime
, mktime
, and localtime
functions to figure it out, but it's nontrivial...