Seconds to human readable format
Perl 6, 273 245 233 230 bytes

-28 bytes thanks to nwellnhof!



{S/rys/ries/}o{S:th(*)/\,/ and/}o{join ', ',map {$_~'s'x(.[0]&gt;1)},grep *[0],(|[R,](.[0].polymod(10 xx 3)),|.skip Z &lt;millennium century decade year month day hour minute second&gt;)}o{~DateTime.new($_-62135596800)~~m:g/\d+/Z-(^6 X&lt;3)}


Try it online!

I think there might be a trick or two I can use with EVAL to make this shorter. This solution takes into account leap seconds, so the last test case is a bit off. Both no longer applicable.

(Old) Explanation:

{                                      } # First code block
 DateTime.new($_-62135596800)  # Initialise a date time object with input amount of seconds
{  ...  }o    # Pass value to the next code block
 fmt(.year-1: "%04d").comb Z   # Zip each digit of the year with
                             &lt;millennium century decade year&gt;  # The appropriate word
 &lt;month day hour minute second&gt;.map:{  ...  }   # For each of these words
                                ".$^a".EVAL     # EVAL the method on the DateTime
                                           -(2&gt;$++)     # -1 if month or day
                                                   ,$a  # Followed by the word itself
  grep +*[0],  # From these, filter out the ones with value 0
  map {$_~'s'x(.[0]&gt;1)},    # Add plurals if greater than 1
  join ', ',                # Join with commas
 {  ...  }o         # Pass string to next code block
  S:th(*)           # Substitute the last instance of
         /\,/       # A comma
            / and/  # With ' and'
 {  ...  }o         # Pass to next code block
  S/rys/ries/       # Fix plural of century