Regarding Windows, it’s time_t values are definitely based on the standard Unix epoch time of 1970.
http://msdn.microsoft.com/en-us/library/1f4c8f33.aspx
But Microsoft documents that they do not return dates for values less than the Unix time epoch (link below). So, yeah, there is your answer why you’re getting nil.
http://msdn.microsoft.com/en-us/library/bf12f0hc.aspx
Now, I don’t think it’s wrong for Microsoft to do this, because the C standard does not define the type for time_t values. Meaning that it’s actually wrong to assume that time_t is a signed integer.
http://en.cppreference.com/w/c/chrono/time_t
In fact, I remember back during the Y2K fiasco, there was much debate about changing time_t to an unsigned integer so that the next Y2K equivalent in 2038, which is when a 32-bit signed time_t value overflows, could be further delayed. But since Unix developers were using negative time_t values already, that put a stop to that and now we have 64-bit signed integer time_t values instead.
That said, in my opinion, for maximum portability and cross-platform support, you should assume that the valid range of a Unix time value is between 1970 and 2038. Otherwise you may be shooting yourself in the foot on a non-Unix platform that you may want to eventually support.