Why not epoch? An integer always means epoch. A human readable timestamp, unless it's exactly ISO8601, is pretty much always ambiguous.
> 2. [...] plus a timezone (not an offset).
Why not offset? ISO8601 is a good standard.
And it takes a very special use case to care about leap seconds. For logging "leap smear" is clearly a better way to solve it, and for time measurements you should always use a monotonic clock, not wall clock.
Oh, and with timezone I assume you mean something like "Europe/New_York", not ambiguous like "EST".
> A date is a period, so either just store the date without a timezone
Of course some dates don't exist in some timezones (and I mean more modern times than gregorian/julian). So you can't count days between two dates without knowing the timezone.
In my opinion there are only two ways to store timestamps that are actually correct: epoch, or iso8601. Everything else will eventually lead to data corruption.
(and even with these two you have to be careful)