Script mais curto que fornece o tempo decorrido desde o carimbo de data / hora do Unix

9

O que você precisa fazer para vencer esse desafio é escrever o script "timeago" mais curto que produza o número de décadas, anos, semanas, dias, horas, minutos e segundos entre um determinado carimbo de data e hora do Unix e a hora em que o script é executado.

Você deve dar a diferença de tempo em "termos mais baixo", por exemplo, 1 weeknão 7 days, 9 yearsnão 0 decades 9 years. Você também deve usar formas plurais corretamente, por exemplo, 1 daynão 1 days.

Seu script deve ter uma precisão de mais ou menos 1 segundo (portanto, o método exato de segundo arredondamento não é importante).

Time Equivalency Table
1 decade = 10 years
1 year = 31536000 seconds (not technically correct but close enough)
1 week = 7 days
1 day = 24 hours
1 hour = 60 minutes
1 minute = 60 seconds

A saída deve ter a forma

A decade(s) B year(s) C week(s) D day(s) E hour(s) F minute(s) G second(s)

onde A...Gestão todos os números inteiros não negativos e ssó existe para os plurais.

Notas

  • O registro de data e hora sempre será um tempo do passado. Pode ser negativo.
  • Entrada e saída podem ser razoáveis: stdin / stdout, entrada de função e valor de retorno, etc.
  • Você não pode usar nenhuma ferramenta que já faça isso. ou seja, se o seu idioma tiver uma timesince(timestamp)função incorporada, você não poderá usá-la.

Eu editei isso amplamente para tornar mais claro as esperanças de amenizar a batalha meio tola entre novos usuários com perguntas pouco claras e usuários antigos que exigem perfeição. Não era uma pergunta terrível (embora agora possa ser muito parecida com isso ).

Dado que se passou um tempo suficiente desde a última resposta, declaro Three If By Whiskey com sua implementação Ruby de 177 bytes o vencedor desse contexto!

Adam Barak
fonte
2
"No caso de Javascript, o JQuery é proibido: P Todo o resto está ok." - o Zepto é permitido, então?
John Dvorak
4
A especificação é meio pobre. Forneça uma definição exata do que deve fazer - um exemplo de implementação não é suficiente.
John Dvorak
11
O Timeago é uma nova linguagem de script? A atualização a cada 30 segundos é opcional (conforme declarado em um local) ou um requisito (conforme declarado em outro)? Quais mecanismos de E / S são aceitáveis? Que arredondamento deve ser usado? Em particular, como o arredondamento interage com períodos de duração variável, como meses e anos civis? Algumas delas podem implicar perguntas de acompanhamento, dependendo de suas respostas.
Peter Taylor
11
@Abdossam Eu sei que todos nós parecemos bastante exigentes, mas é porque as perguntas neste site devem ter critérios objetivos de vitória e uma especificação clara .
Hobbies de Calvin
11
Duas sugestões: 1) Deixe de fora a parte HTML. Acho que ninguém quer escrever um analisador de HTML antes de poder enfrentar a tarefa real dos tempos de impressão. 2) Deixe claro que você restringe a "segundo (s)", "minuto (s)", "hora (s)" e "dia (s)". Você pode adicionar "semana (s)", se desejar. Mas meses e anos não são tão claramente definidos (28-31 dias / 365 ou 366 dias ...). Isso deve corrigir as principais preocupações com essa questão no meu ponto de vista.
Falko

Respostas:

2

Ruby, 184 177

->n{x=Time.now.to_i-n;d=[3650*y=86400,365*y,7*y,y,3600,60,1];(0..6).map{|i|c=x/d[i];(x%=d[i]*c;"#{c} #{%w[decade year week day hour minute second][i]}#{c<2?'':'s'}")if c>0}*' '}

Não há nada particularmente inteligente aqui, mas suspeito que ainda esteja muito próximo do ideal.

Exemplo de execução

p ->n{x=Time.now.to_i-n;d=[3650*y=86400,365*y,7*y,y,3600,60,1];(0..6).map{|i|c=x/d[i];(x%=d[i]*c;"#{c} #{%w[decade year week day hour minute second][i]}#{c<2?'':'s'}")if c>0}*' '}[0]
"4 decades 4 years 41 weeks 3 days 14 hours 20 minutes 48 seconds"
Três se pelo uísque
fonte
2

J, 165

;' '&,@":&.>@((#~([:*&>{."1))@((;:' decades years weeks days hours minutes seconds')(],.([}.~[:-1=])&.>)<"0@(_ 10 52 7 24 60 60&#:)@(-~([:".@}:[:2!:0'date +%s'"_))))

Provavelmente pode ser jogado mais. Usa uma chamada de shell até a data para obter a hora atual da época unix, pois a época Unix não está disponível em J.

Exemplo de execução:

;' '&,@":&.>@((#~([:*&>{."1))@((;:' decades years weeks days hours minutes seconds')(],.([}.~[:-1=])&.>)<"0@(_ 10 52 7 24 60 60&#:)@(-~([:".@}:[:2!:0'date +%s'"_)))) 0
4 decades 4 years 41 weeks 3 days 12 hours 54 minutes 1 second
jpjacobs
fonte
2

Python - 183

import time;t=int(time.time()-input());d=86400
for f,u in zip((3650*d,365*d,7*d,d,3600,60,1),'decade year week day hour minute second'.split()):
 if t/f:print`t/f`,u+'s'*(t/f>1),;t%=f

Saída para um carimbo de data / hora 999996400 segundos no passado:

3 decades 1 year 37 weeks 46 minutes 39 seconds
Falko
fonte
1

JavaScript, 392

t=function(c){i=function(){var a=+new Date/1e3-c,b=document;29>a?b.write("just now"):60>a?b.write((a|0)+" seconds ago"):60<a&&120>a?b.write("1 minute ago"):60>a/60?b.write((a/60|0)+" minutes ago"):60<a/60&&120>a/60?b.write("1 hour ago"):24>a/3600?b.write((a/3600|0)+" hours ago"):24<a/3600&&48>a/3600?b.write("1 day ago"):1<=a/86400&&b.write((a/86400|0)+" days ago")};i();setInterval(i,3e4)};

Também o código não minificado para os curiosos

t = function(timestamp){

i = function() {
var diff = (+new Date/1e3)-(timestamp),
d = document;

    if( (diff) < 29) {

        d.write( 'just now' )
    }
    else if( diff < 60) {

        d.write( ( (diff) |0 ) + ' seconds ago' )
    }
    else if( diff > 60 && diff < 120) {
        d.write(  '1 minute ago' )
    }
    else if( (diff)/60 < 60) {
        d.write( ( (diff)/60 |0 ) + ' minutes ago' )
    }
    else if( (diff)/60 > 60 && (diff)/60 < 120) {
        d.write( '1 hour ago' )
    }
    else if( (diff)/3600 < 24) {
        d.write( ( (diff)/3600 |0 ) + ' hours ago' )
    }
    else if( (diff)/3600 > 24 && (diff)/3600 < 48) {
        d.write( '1 day ago' )
    }
    else if( (diff)/86400 >= 1) {
        d.write( ( (diff)/86400 |0 ) + ' days ago' )
    }
  }

i()

setInterval(i, 3e4)

}

Ele é atualizado a cada 30 segundos e calcula o singular e o plural.

Para executá-lo, use t(unix_timestamp)

user965091
fonte
Você não deve usar a notação de flecha gorda?
haskeller orgulhoso
@ user965091 Evite fazer acusações sem qualquer prova através de comentários públicos em postagens não relacionadas; se você acha que alguém está usando uma conta de meias, sinalize uma postagem para atenção do moderador. Não vejo absolutamente nenhuma razão para suspeitar de qualquer estupidez aqui, e mesmo que houvesse, essa discussão não deveria ser realizada em público.
Maçaneta
@ user965091 Não vejo como alguns dos comentários aqui podem ser considerados "provocações". Em qualquer caso, a grosseria não é tolerada na rede Stack Exchange . Tente permanecer cortês com todos os usuários, independentemente de você suspeitar que eles estejam violando as regras ou por qualquer outro motivo.
Maçaneta
1

Javascript, 287

function p(e,n){return e>2?e+" "+n+"s ":e+" "+n+" "}function t(e){n=new Date/1e3,l=e-n,c=1,m=60,h=60*m,d=24*h,w=7*d,y=365*d,a=10*y,s="",v={a:"Decade",y:"Year",w:"Week",d:"Day",h:"Hour",m:"Minute",c:"Second"};for(i in v)k=v[i],i=window[i],(r=Math.floor(l/i))>0&&(s+=p(r,k)),l%=i;alert(s)}

executar o uso t(secondsInFuture);

Vitória
fonte
11
Quando corro t(10), apenas fico vazio alert.
Ingo Bürk
Ugh, esqueci os segundos, obrigado @ IngoBürk. Para ser claro o seut(new Date()/1000 + 10);
Vitória
Use a notação de seta gorda do ES6, também eval(i)é 2 bytes menor que window[i].
usar o seguinte código
0

Javascript, 263

i=[315360000,31536000,604800,86400,3600,60,1];s=['decade','year','week','day','hour','minute','second'];function g(d){return p(parseInt((new Date().getTime()-d)/1000), 0);}function p(d,n){k=d-d%i[n];r=k/i[n];return (r>0?r+' '+s[n]+'(s) ':'')+(n<6?p(d-k,n+1):'');}

para executar no console Javascript, chame

g(unixTimestamp);
DaveMorganTexas
fonte