Unixタイムスタンプからの経過時間を示す最短のスクリプト


9

この課題を克服するために必要なことは、特定のUnixタイムスタンプとスクリプトが実行される時間との間の数十年、年、週、日、時間、分、秒の数を出力する最短の「timeago」スクリプトを記述することです。

あなたは、例えば、「最低条件」の時間差を与えなければなら1 weekない7 days9 yearsではありません0 decades 9 years。また、1 daynotなど、複数形も正しく使用する必要があります1 days

スクリプトは、±1秒以内で正確でなければなりません(そのため、正確な2番目の丸め方法は重要ではありません)。

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 decade(s) B year(s) C week(s) D day(s) E hour(s) F minute(s) G second(s)

ここでA...G、すべて負でない整数でsあり、複数形の場合のみ存在します。

ノート

  • タイムスタンプは常に過去からの時間になります。ネガティブかもしれません。
  • 入力と出力は、合理的なものであれば何でもかまいません。stdin/ stdout、関数の入力と戻り値など。
  • 既にこれを行っているツールを使用することはできません。つまり、言語にtimesince(timestamp)関数が組み込まれている場合は、その関数を使用できません。

私はこれを大幅に編集して、明確でない質問を持つ新しいユーザーと完璧を必要とする古いユーザーとの間のいくぶんばかげた戦いを和らげることを期待してより明確にするようにしています。(今はとあまりにも似ているかもしれませんが、それはひどい問題ではありませんでした。この)。

最後の回答から十分な時間が経過していることを考慮して、177バイトの Ruby実装を持つThree If By Whiskyがこのコンテキストの勝者であると宣言します!


2
「Javascriptの場合、JQueryは禁止されています:Pそれ以外はすべて問題ありません。」-さZeptoは、その後、許可されていますか?
John Dvorak、

4
スペックはちょっと悪いです。何をすべきかを正確に定義してください-実装例では不十分です。
John Dvorak、

1
Timeagoは新しいスクリプト言語ですか?30秒ごとの更新はオプション(ある場所で述べられているように)または要件(別の場所で述べられているように)ですか?許容できるI / Oメカニズムは何ですか?どの丸めを使用する必要がありますか?特に、丸めは、暦月や年などの可変長の期間とどのように相互作用しますか?これらのいくつかは、あなたの回答に応じて、フォローアップの質問を意味する場合があります。
Peter Taylor

1
@Abdossam私たちは皆、かなりうるさいように見えますが、これは、このサイトの質問には客観的な勝利基準 明確な仕様があるはずだからです。
カルバンの趣味

1
2つの提案:1)HTML部分を省略します。時間を印刷するという実際のタスクに取り組むことができるようになる前に、HTMLパーサーを作成したいと思う人はいないでしょう。2)「秒」、「分」、「時間」、および「日」に制限することを明確にしてください。必要に応じて、「週」を追加できます。しかし、月と年は明確に定義されていません(28-31日/ 365または366日...)。これは、私の見解では、この質問に関する主要な懸念を解決するはずです。
ファルコ2014

回答:


2

ルビー、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}*' '}

ここで特に賢いことは何もありませんが、それでも最適に非常に近いと思います。

実行例

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"

2

J、165

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

おそらくもっとゴルフすることができます。JではUnixエポックが利用できないため、現在のUNIXエポック時間を取得するために日付へのシェル呼び出しを使用します。

実行例:

;' '&,@":&.>@((#~([:*&>{."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

2

パイソン-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

過去のタイムスタンプ999996400秒の出力:

3 decades 1 year 37 weeks 46 minutes 39 seconds

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)};

また、好奇心旺盛な人のための非縮小コード

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)

}

30秒ごとに更新され、単数と複数の両方を計算します。

実行するには t(unix_timestamp)


ファットアロー表記を使用しないでください。
誇り高いハスケラー2014

@ user965091関連のない投稿へのパブリックコメントを介した証明なしに非難を投げかけることは避けてください。誰かがsockアカウントを使用していると思われる場合は、モデレーターの注意のために彼らの投稿にフラグを立てます。私はここで靴下人形を疑う理由はまったくないと思います。たとえあったとしても、そのような議論は公に行われるべきではありません。
ドアノブ

@ user965091ここのコメントのどれが「挑発」と見なされるかはわかりません。いずれにしても、無礼は Stack Exchangeネットワークでは許容さません。規則違反の疑いがあるかどうか、またはその他の理由にかかわらず、すべてのユーザーに礼儀正しく接するようにしてください。
ドアノブ

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)}

使用するためにt(secondsInFuture);


1
実行するt(10)と、空になりalertます。
IngoBürk2014

ああ、秒を忘れてしまいました、@IngoBürkに感謝します。明確にするにはt(new Date()/1000 + 10);
勝利

ES6の太い矢印表記を使用しeval(i)ますwindow[i]。これも2バイト短いです。
nyuszika7h 14

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):'');}

JavaScriptコンソールから実行するには、次を呼び出します

g(unixTimestamp);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.