[Question]
  [
Write a short program which takes in a positive number of seconds representing an age, and outputs an estimate of that time in English.
Your program must output the *least precise* amount of time which has passed, among the following metrics and their lengths in seconds:
```
second = 1
minute = 60
hour   = 60 * 60
day    = 60 * 60 * 24
week   = 60 * 60 * 24 * 7
month  = 60 * 60 * 24 * 31
year   = 60 * 60 * 24 * 365
```
**Examples**
```
input      : output
1          : 1 second
59         : 59 seconds
60         : 1 minute
119        : 1 minute
120        : 2 minutes
43200      : 12 hours
86401      : 1 day
1815603    : 3 weeks
1426636800 : 45 years
```
As you can see above, after the time of say, 1 day (60 \* 60 \* 24 = 86400 seconds), **we no longer output minute(s) or hour(s)**, but only days until we surpass the time of one week, and so on.
Consider the given length of time to be an age. For example, after 119 seconds, 1 minute has *passed*, not 2.
**Rules**
* No specification for 0 or negative inputs.
* Follow proper pluralization. Every measure greater than 1 must include an `s` following the word.
* You may not use a pre-existing library which serves the function of the entire program.
* This is a code golf, shortest program wins the internet points.
* Have fun!
  
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), 62 [bytes](https://github.com/DennisMitchell/jelly/wiki/Cde-page)
```
TṀị
“¢<<ð¢‘×\×€0¦7,31,365F⁸:µç“ɲþḣ⁹ḢṡṾDU¤µQƝṁ⁼ẹ»Ḳ¤ṭÇK;⁸Ç>1¤¡”s
```
A full program printing the result.  
(As a monadic link it returns a list of an integer followed by characters)
**[Try it online!](https://tio.run/##AYYAef9qZWxsef//VOG5gOG7iwrigJzCojw8w7DCouKAmMOXXMOX4oKsMMKmNywzMSwzNjVG4oG4OsK1w6figJzJssO@4bij4oG54bii4bmh4bm@RFXCpMK1Ucad4bmB4oG84bq5wrvhuLLCpOG5rcOHSzvigbjDhz4xwqTCoeKAnXP///84NjQwMQ "Jelly – Try It Online")**
### How?
```
TṀị - Link 1: list of integers, K; list, V  e.g. [86401,1440,24,1,0,0,0], ["second","minute","hour","day","week","month","year"]
T   - truthy indexes of K                        [1,2,3,4]
 Ṁ  - maximum                                    4
  ị - index into V                               "day"
“¢<<ð¢‘×\×€0¦7,31,365F⁸:µç“...»Ḳ¤ṭÇK;⁸Ç>1¤¡”s - Main link: integer, N  e.g. 3599
“¢<<ð¢‘                                       - list of code-page indices = [1,60,60,24,1]
        \                                     - cumulative reduce with:
       ×                                      -  multiplication = [1,60,3600,86400,86400]
             7,31,365                         - list of integers = [7,31,365]
            ¦                                 - sparse application...
           0                                  - ...to index: 0 (rightmost)
         ×€                                   - ...of: multiplication for €ach = [1,60,3600,86400,[604800,2678400,31536000]]
                     F                        - flatten = [1,60,3600,86400,604800,2678400,31536000]
                      ⁸                       - chain's left argument, N    3599
                       :                      - integer divide         [3599,59,0,0,0,0,0]
                        µ                     - start a new monadic chain, call that X
                                ¤             - nilad followed by links as a nilad:
                          “...»               -   compression of "second minute hour day week month year"
                               Ḳ              -   split at spaces = ["second","minute","hour","day","week","month","year"]
                         ç                    - call the last link (1) as a dyad - i.e. f(X,["second","minute","hour","day","week","month","year"])
                                              -                             "minute"
                                  Ç           - call the last link (1) as a monad - i.e. f(X,X)
                                              -                             59
                                 ṭ            - tack                        [59,['m','i','n','u','t','e']]
                                   K          - join with spaces            [59,' ','m','i','n','u','t','e']
                                           ”s - literal character '
                                          ¡   - repeat...
                                         ¤    - ...number of times: nilad followed by link(s) as a nilad:
                                     ⁸        -   chain's left argument, X  [3599,59,0,0,0,0,0]
                                      Ç       -   call the last link (1) as a monad - i.e. f(X,X)
                                              -                             59
                                       >1     -   greater than 1?           1
                                    ;         - concatenate                 [59,' ','m','i','n','u','t','e','s']
                                              - implicit print - smashes to print  "59 minutes"
```
[Answer]
# C, 194 180 144 128 characters
Thanks to @gastropher for the code reductions. I forgot that C allows for implicit parameters using K&R-style functions! Also thanks to @gmatht for the idea of putting literals inside instead of arrays. I extended that to the characters by abusing taking advantage of wide character/`char16_t` strings! The compiler doesn't seem to like `\1` in its ☺ form though.
```
f(t,c,d){for(c=7;!(d=t/L"\1<ฐ\1•▼ŭ"[--c]/(c>2?86400:1)););printf("%d %.6s%s\n",d,c*6+(char*)u"敳潣摮業畮整潨牵 慤y†敷步 潭瑮h敹牡",(d<2)+"s");}
```
[Try it online!](https://tio.run/##VY6xToNAAIZ3nuI8Q3JHjxYag1UovoBvUDrgnZRLKhigTUzThMWhmx1w1moTF1jUqImMvodhOB4DYXT7v@8f/p@qM0qbQx7Q@YJdAitO2Jxf9H1b@ud42KrGQwmhhOGVF0aIjo/NA8TGyeAcOrr1@3nn6FW6q@6/f3I4UVU6HSBqD89GxpGmneoYm9i8jniQeAjKDMh9I5ZjJ4CEEaoYPUR9N1LwAorsVZRPYluIfV5nhcjeRPlSb96rNBW3zzdV@iCyD5HvOy7zelv4IvuqN4@QIGYNcQ/GEJvrph0CVy4PUBfcaEYJ6BaAorSwxGAlAQC4h7rK1jFoUxLyDpcTfdq@ldZNMzJONO0P "C (gcc) – Try It Online")
# Original solution
I split up the arrays into separate lines to make it easier to see the rest of the solution.
```
char *n[]={"second","minute","hour","day","week","month","year"};
int o[]={1,60,3600,86400,604800,2678400,31536000};
f(int t){int c=7,d;while(!(d=t/o[--c]));printf("%d %s%s\n",d,n[c],d>1?"s":"");}
```
[Try it online!](https://tio.run/##VU9BbsMgELz7FZTKkolwC01KrFK7D3F9IIBjVAcqjBNFlt/uQnvqZWdnZ2dWK8uzlNujsXKclQbvU1CjOT0NTfZvZlwcbXIQHuxs29ULnLR0VkEML8bOQcdmcLOPoMQ91pvWX0l0NgwR71p4uHJjA3DJTjEjeM8IwRU7xMrIoYrwwo5Vonv6mkSy8r5InoCWBLI@YsVvgxl18VCoOjy7tixlhxD/9nGhL2CuQD7l06eFWGHbyg6rhn7ACb5BiPi6pZiLMPY3VvizxODvq10kVwSWDABg@iJJDUUgdsGZRK8tTYeyddvoDw "C (gcc) – Try It Online")
Running the divisors in order from largest to smallest, we get the coarsest unit of time. The program misbehaves if you give it 0 seconds, but as the specification explicitly excludes this value, I deem that to be acceptable.
[Answer]
# [Perl 5](https://www.perl.org/), 110 bytes
```
year31536000month2678400week604800day86400hour3600minute60second1=~s:\D+:say"$% $&",$_=$%>1&&"s"if$%=$_/$':reg
```
[Try it online!](https://tio.run/##NcpBDoIwEEDRq5hmwIWCU6GVkODKrTcwIUQGaZSWtBDDxqM76sK/fPkj@YdiXqjxmVSZRsTB2anf60ORIz6J7hrzArFtlkJ/pXez/22DsfNEGgNdnW1l9Qrl5bQpQ7MIiFYQiy3UFURHGcciCNNBVEG9g3Xp6cYs8d/bjZNxNnBiOTmrVGKKHw "Perl 5 – Try It Online")
[Answer]
# [Stax](https://github.com/tomtheisen/stax), 54 [bytes](https://github.com/tomtheisen/stax/blob/master/docs/packed.md#packed-stax)
```
▀♂♂┼╕Qá◙à*ä∙Φò►⌠╨Ns↔║►πîÇ∙cI≡ªb?δ♪9gΓ╕┬≥‼⌡Öå01:♪EoE╘≡ë
```
[Run and debug it](https://staxlang.xyz/#p=df0b0bc5b851a00a852a84f9e89510f4d04e731dba10e38c80f96349f0a6623feb0d3967e2b8c2f213f5998630313a0d456f45d4f089&i=1%0A59%0A60%0A43200%0A86401%0A1815603%0A1426636800&a=1&m=2)
Here's the unpacked, ungolfed, ascii representation of the same program.
```
                            stack starts with total seconds
c60/                        push total minutes to stack
c60/                        ... hours 
c24/                        ... days
Yc7/                        ... weeks
y31/                        ... months
y365/                       ... years
L                           make a list out of all the calculated time units
`)sQP(dr'pk,oV4?_HIFD?x`j   compressed literal for singular forms of unit names
\                           zip totals with names
rF                          foreach pair of total and name (in reverse orer)
  h!C                       skip if the current total is falsey (0)
  _J                        join the total and unit name with a space
  's_1=T+                   concat 's' unless the total is one
```
Following execution, since there's no other output, the top of the stack is printed implicitly.
[Run this one](https://staxlang.xyz/#c=+++++++++++++++++++++++++%09stack+starts+with+total+seconds%0Ac60%2F+++++++++++++++++++++%09push+total+minutes+to+stack%0Ac60%2F+++++++++++++++++++++%09...+hours+%0Ac24%2F+++++++++++++++++++++%09...+days%0AYc7%2F+++++++++++++++++++++%09...+weeks%0Ay31%2F+++++++++++++++++++++%09...+months%0Ay365%2F++++++++++++++++++++%09...+years%0AL++++++++++++++++++++++++%09make+a+list+out+of+all+the+calculated+time+units%0A%60%29sQP%28dr%27pk,oV4%3F_HIFD%3Fx%60j%09compressed+literal+for+singular+forms+of+unit+names%0A%5C++++++++++++++++++++++++%09zip+totals+with+names%0ArF+++++++++++++++++++++++%09foreach+pair+of+total+and+name+%28in+reverse+orer%29%0A++h%21C++++++++++++++++++++%09skip+if+the+current+total+is+falsey+%280%29%0A++_J+++++++++++++++++++++%09join+the+total+and+unit+name+with+a+space%0A++%27s_1%3DT%2B++++++++++++++++%09concat+%27s%27+unless+the+total+is+one&i=1%0A59%0A60%0A43200%0A86401%0A1815603%0A1426636800&a=1&m=2)
[Answer]
# JavaScript (ES6), 131 bytes
```
n=>[60,60,24,7,31/7,365/31,0].map((v,i)=>s=n<1?s:(k=n|0)+' '+'second,minute,hour,day,week,month,year'.split`,`[n/=v,i])|k>1?s+'s':s
```
[Try it online!](https://tio.run/##XZBta4MwEIC/71fkW5TeNDExtWVxP6QUGmraOjURYzsK/e8uIhszx3Fw8PDcy5d6KHce6n58N7bS00VORpYHQcBnxmELjKa@iDxlFMgx6VQfRQ@oY1k6aT7op9tHjTQvEm8wwhvs9NmaCrra3EcNN3sfoFJP@Na6gc6a8QZPrQacuL6txxOcDiaVXneMX03pZV6A927yDmdbnbT2Gl0iin4jjlGaIoqWKW9rLN@tMd8vnAtAQULfsm6AcZYR8h/L0HxPaCsEJ3Rl8wcHDC1oLgj7YxiaHxKaKM@EYKIgZKF4juZnuekH "JavaScript (Node.js) – Try It Online")
[Answer]
# Java 8, ~~197~~ ~~195~~ 157 bytes
```
n->(n<60?n+" second":(n/=60)<60?n+" minute":(n/=60)<24?n+" hour":(n/=24)<7?n+" day":n<31?(n/=7)+" week":n<365?(n/=31)+" month":(n/=365)+" year")+(n>1?"s":"")
```
-38 bytes thanks to *@OlivierGrégoire*.
**Explanation:**
[Try it online.](https://tio.run/##hY/LboMwEEX3@YqRV7aipJiHQwgJX9Bsuqy6cMFtSGCMwKRCVb6dGkjUVYtky/KZa/mes7zKla4UnrNLnxayaeBZ5vi9AMjRqPpDpgqOwxXgxdQ5fkJKC20PZDtLb3bb1Rhp8hSOgLCHHlcHirFwElwSaFSqMSMRxae9cNgDlzm2Rv1i1x/xSbf1BF2fxZuRZbIjEcYeTwa@YRZ9KXUZmQhG6PGBlhrNaXptBwPplKwJW1I88IQ0JCKE9bupctW@F7byvflV5xmU1pxOlq9vkt2tu8aocq1bs67sxBRIcZ1Szkb/P@fBdiZgpf8PbOcC3J1L@J7rzGVC4TtzMjzkgXC8uZTvCuGJ8PHlbXHrfwA)
```
n->               // Method with long parameter and String return-type
  (n<60?          //  If `n` is below 60:
    n             //   Output `n`
    +" second"    //   + " second"
   :(n/=60)<60?   //  Else-if `n` is below 60*60
    n             //   Integer-divide `n` by 60, and output it
    +" minute"    //   + " minute"
   :(n/=60)<24?   //  Else-if `n` is below 60*60*24:
    n             //   Integer-divide `n` by 60*60, and output it
    +" hour"      //   + " hour"
   :(n/=24)<7?    //  Else-if `n` is below 60*60*24*7:
    n             //   Integer-divide `n` by 60*60*24, and output it
    +" day"       //   + " day"
   :n<31?         //  Else-if `n` is below 60*60*24*31:
    (n/=7)        //   Integer-divide `n` by 60*60*24*7, and output it
    +" week"      //   + " week"
   :n<365?        //  Else-if `n` is below 60*60*24*365:
    (n/=31)       //   Integer-divide `n` by 60*60*24*31, and output it
    +" month"     //   + " month"
   :              //  Else:
    (n/=365)      //   Integer-divide `n` by 60*60*24*365, and output it
    +" year")     //   + " year"
   +(n>1?"s":"")  //  And add a trailing (plural) "s" if (the new) `n` is larger than 1
```
[Answer]
# [Kotlin](https://kotlinlang.org), ~~205~~ ~~203~~ 196 bytes
```
x->val d=86400
with(listOf(1 to "second",60 to "minute",3600 to "hour",d to "day",d*7 to "week",d*31 to "month",d*365 to "year").last{x>=it.first}){val c=x/first
"$c ${second+if(c>1)"s" else ""}"}
```
[Try it online!](https://tio.run/##ZZBBboMwEEX3nMKysrAbkpoALo0E@6666AksMMGKMZU9JESIs1MwuzLSSPPfSF9/5t6BVmaue4NaoQx5CCvsDS3trugHrDI3isYALfUQGtVXMly/DNBTsS3zcR5Oxbqq8ownjAVPBQ3RysF3TSIEHcJOlp2pcMiZl60yPUgcxpxtoOl6i8PKz5V4LePbhxdPKe@rijeftjPQeM1TD15SWEzPWjgYhyJXcK6VdTDRcQ1U5sO71wE@lOgwbjGOqiZlEVHsMJLaSYTxhKd5CvyNv8tNoA1ZolP6j6SfO8TZDiXxhe3p@pq9Y5RFKWfxnicXzmOeeaNp/gM "Kotlin – Try It Online")
[Answer]
# [T-SQL](https://www.microsoft.com/sql-server), 306 bytes (281 bytes without I/O)
```
DECLARE @n INT=1
DECLARE @r VARCHAR(30)=TRIM(COALESCE(STR(NULLIF(@n/31536000,0))+' year',STR(NULLIF(@n/2678400,0))+' month',STR(NULLIF(@n/604800,0))+' week',STR(NULLIF(@n/86400,0))+' day',STR(NULLIF(@n/3600,0))+' hour',STR(NULLIF(@n/60,0))+' minute',STR(@n)+' second'))IF LEFT(@r,2)>1 SET @r+='s'
PRINT @r
```
[Answer]
# [R](https://www.r-project.org/), 157 bytes
```
function(n,x=cumprod(c(1,60,60,24,7,31/7,365/31)),i=cut(n,x),o=n%/%x[i])cat(o," ",c("second","minute","hour","day","week","year")[i],"if"(o>1,"s",""),sep="")
```
[Try it online!](https://tio.run/##FYtRCoMwEESvIguFDWzRVGv7UXuR0g@JCQ3FrMSE6unTFYZ5wzATi6se5@JyMMlzwEDbYPK8RJ7QoKa@OXTp6EatrsX6a91qpcjLLB1zRTyEU33aXv6tzJiQCSogg7Baw2ECgtmHnKyED@comMZd/GftV7DbMYKSM4F3gPzUBKv0oGi1yyAsDu9912hV/g "R – Try It Online")
`cut` is handy, since it splits ranges into `factor`s, which are stored internally as `integer`s, meaning we can use them as array indices as well. We can probably do something a bit more clever with the time period names, but I can't figure it out just yet.
[Answer]
# APL+WIN, ~~88~~ 119 bytes
Original version missed out weeks and months as pointed out by Phil H;(
Prompts screen input of number of seconds
```
a←⌽<\⌽1≤b←⎕÷×\1 60 60 24 7,(31÷7),365÷31⋄b,(-(b←⌊a/b)=1)↓∊a/'seconds' 'minutes' 'hours' 'days' 'weeks' 'months' 'years'
```
Explanation
```
b←⎕÷×\1 60 60 24 7,(31÷7),365÷31 prompts for input and converts to years, days, hours, minutes, seconds
a←⌽<\⌽1≤b identify largest unit of time and assign it to a
a/'years' 'days' 'hours' 'minutes' 'seconds' select time unit
(-(b←⌊a/b)=1)↓∊ determine if singular if so drop final s in time unit
b, concatenate number of units to time unit from previous steps
```
[Answer]
# [JavaScript (Node.js)](https://nodejs.org), 177 bytes
```
x=>{return d=86400,v=[[d*365,'year'],[d*31,'month'],[d*7,'week'],[d,'day'],[3600,'hour'],[60,'minute'],[1,'second']].find(i=>x>=i[0]),c=parseInt(x/v[0]),c+' '+v[1]+(c>1?'s':'')}
```
[Try it online!](https://tio.run/##bZDBUoMwFEX3fkV3DyStSQOR6gTXfgOTRYYEG22TThKQjuO3I9CVU3b3nDf3Lt6n7GVovLnErXVKjy0fB179eB07bzeKlyzHGPW8rtUjZQWCq5YeBJqRIDg7G483fEbwrfXXAgiUvM6JsqkNR9ctHTbls7Fd1DNN9aAbZxUIsWuNVYnh1VBxU2ORooZfpA/63cZkeOpvKoMNZH1NRJY0FXmDAC8A6e84jQR30ruT@0jahKTp68N/VRzuHcP3Lqd7vKLnJ6yskpIUDNOVQ75njLJy2Rr/AA "JavaScript (Node.js) – Try It Online")
[Answer]
## Batch, 185 bytes
```
@for %%t in (1.second 60.minute 3600.hour 43200.day 302400.week, 1339200.month, 15768000.year)do @if %1 geq %%~nt set/an=%1/%%~nt&set u=%%~xt
@if %n% gtr 1 set u=%u%s
@echo %n%%u:.= %
```
[Answer]
# [Python 2](https://docs.python.org/2/), ~~146~~ 144 bytes
```
lambda n,d=86400:[`n/x`+' '+y+'s'*(n/x>1)for x,y in zip([365*d,31*d,7*d,d,3600,60,1],'year month week day hour minute second'.split())if n/x][0]
```
[Try it online!](https://tio.run/##FY/BboMwEETPzVfszRBW6RqDSyKRH6FIobURVpM1AkeN@/PUHHa0M4d5u3MMk@dyG9vP7T48vswAjKZtdEV06W78/roVAkQRC7GKY5b8VeajX@CFERzDn5uzTun6aFDJJB9p0qqJUBPKHkW0wwIPz2GCX2t/wAwRJv9MmeNnsLDab89GnNb57kKW526EROk76redwzulk1if90KoVJmqYb9PIshG1poUyqrUWumGqL8c3ubFcUhvgGivAmHMOD9s/w "Python 2 – Try It Online")
2 bytes saved thanks to Jonathan Allan
[Answer]
# [PHP](https://php.net/), 183 bytes
```
<?$a=[second=>$l=1,minute=>60,hour=>60,day=>24,week=>7,month=>31/7,year=>365/31];foreach($a as$p=>$n){$q=$n*$l;if($q<=$s=$argv[1])$r=($m=floor($s/$q))." $p".($m>1?s:"");$l=$q;}echo$r;
```
[Try it online!](https://tio.run/##HY7BisIwFEV/RcpbNBLtxEyVTnzxQ8RFqKkptnlpUmeQYX7dWGZ3ORwON7iQ8/EEBs/JtuSvqGFAwcfeP2aLev/BHT3i/7iaJ@rdJ/@x9o76wEfys0MtRXXgT2sWSe7rSoqL6iha07oSzMokCEvTs1@YEPwaBtV3JUxHhIRg4u37LC4MIpYwYjcQxRJSBRNj22IFodguXItT@ioKppZrMKk/2zqCqHLOUtSybprmRWHuyae88W8)
[Answer]
# [Julia 0.6](http://julialang.org/), 161 bytes
```
f(n,d=cumprod([1,60,60,24,7,31/7,365/31]),r=div.(n,d),i=findlast(r.>=1),l=Int(r[i]))="$l $(split("second minute hour day week month year",' ')[i])$("s"^(l>1*1))"
```
[Try it online!](https://tio.run/##VY3RisMgEEXf@xUigWqR1onJbPpg3/cbSguhGmrXmGBMl359NnlahGHg3DuHec3etbgsHQvC6Mfcj3Ew7AoC5TZlJb6EgtO6sD4puHERtXHv43bOhdOdC8a3U2LxeNHAhdffYYWru3GuaeFJwabRu8ToZB9DMKR3YU6WPIc5EtN@yK@1P6QfQnqSj20jFXuy55terAq9M3@BA3BOlzG6kHxgHVtx90/1OUOUGQLkNZR5X6lS5kmDlcw/QAM1SpVnVYmosNnk5Q8 "Julia 0.6 – Try It Online")
[Answer]
# [Ruby](https://www.ruby-lang.org/), 129 bytes
```
->n{x=[365*d=24*k=3600,d*31,d*7,d,k,60,1].index{|j|0<d=n/k=j};"#{d} #{%w{year month week day hour minute second}[x]}#{d>1??s:p}"}
```
[Try it online!](https://tio.run/##VZDdboMwDIXv@xQW1VSpyrqEQMa60T4I4oKRdKRoCSqgUgHPzsLPgObCiv2dYzu5ld@P7uJ3rydVV35Ambvnvu3sU58yjBHfU2LCO@IoRQwjEh6k4qKqm2uDv7iv3lL/2n5a25q3sK1f7vVDRDf41apI4C5ECjx6QKJLU5OqLATkItaKt0EVtsZ0Iudzfsxaq@2CDUBAYD4ILDKpLYAQ9dj9WGOTjTy3Rszws3scObsdamO8YHvYK5@xxxxMVm6zuTVkIyYecRmmE6bD63rzP3ZsxijzzASDHRf6jxiab8KDiOIEuIZGIt0YdXaTqoCdVFlZHPuOu75YFjnIhf7oka3oJZDhIhBVJuJC8OMi0NNlIxTv/gA "Ruby – Try It Online")
[Answer]
# [Perl 6/Rakudo](https://perl6.org/) 138 bytes
I'm sure there's further to go, but for now
```
{my @d=(365/31,31/7,7,24,60,60);$_/[[email protected]](/cdn-cgi/l/email-protection) while @d&&$_>@d[*-1];$_.Int~" "~ <year month week day hour minute second>[+@d]~($_>1??"s"!!"")}
```
Explicate:
```
{ # bare code block, implicit $_ input
    my @d=(365/31,31/7,7,24,60,60); # ratios between units
    $_ /= @d.pop while @d && $_ > @d[*-1]; # pop ratios off @d until dwarfed
    $_.Int~   # implicitly output: rounded count
        " "~  # space
        <year month week day hour minute second>[+@d]~ # unit given @d
        ($_>1??"s"!!"")  # plural
}
```
[Answer]
# R, 336
Working in progress
```
function(x){
a=cumprod(c(1,60,60,24,7,31/7,365/31))
t=c("second","minute","hour","day","week","month")
e=as.data.frame(cbind(table(cut(x,a,t)),a,t))
y=x%/%as.integer(as.character(e$a[e$V1==1]))
ifelse(x>=a[7],paste(x%/%a[7],ifelse(x%/%a[7]==1,"year","years")),
ifelse(y>1,paste(y,paste0(e$t[e$V1==1],"s")),paste(y,e$t[e$V1==1])))}
```
[Answer]
# [R](https://www.r-project.org/), 246 bytes
```
f=function(x,r=as.integer(strsplit(strftime(as.POSIXlt(x,"","1970-01-01"),"%Y %m %V %d %H %M %S")," ")[[1]])-c(1970,1,1,1,1,0,0),i=which.max(r>0)){cat(r[i],paste0(c("year","month","week","day","hour","minute","second")[i],ifelse(r[i]>1,"s","")))}
```
[Try it online!](https://tio.run/##LU3BasMwDL3vK4zBYINb7CTN0kN63g5jg8LYCDkEx17MEqfYDm0Z@/ZMMUPi6UnvSfLramqzOBXt7OiN@7oLe@ui/tKehujDZbRxIybaSVMQ317Pzx9jBC/GHMvjo9gJCYkZx@QTkQmRd0R6RJ4QeUHkvM0RZk0j25btFN02uPwPwQXjtr4OVg37qbtRfxKM/aguUt/Yll@6ELWgiuK77jz8m2YXB6hXrb@h9N0dcJiXpFm3RA0kaDW7Hn7CBWv0GHS6dpIggYwZY7@roZI9GHo4bliKDaVMjcxSV@SZSKQqC5G8spKHUuSJFllZ5mUFjvUP "R – Try It Online")
This is using time formating instead of arithemtics, just for the hell of it. Maybe others could make this smaller?
]