提供自Unix时间戳以来经过的时间的最短脚本


9

为克服这一挑战,您需要做的是编写最短的“ timeago”脚本,该脚本输出在给定的Unix时间戳与脚本运行时间之间的数十年,数年,数周,数天,数小时,数分钟和数秒的时间。

您必须以“最低的条款”给出时差,例如1 weeknot 7 days9 yearsnot 0 decades 9 years。您还必须正确使用复数形式,例如,1 day不能1 days

您的脚本必须精确到正负1秒以内(因此精确的第二个舍入方法并不重要)。

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 Whiskey,这是这种情况的赢家!


2
“如果是Javascript,则禁止使用JQuery:P其他一切都还可以。” - 那么Zepto被允许吗?
约翰·德沃夏克

4
规格有点差。请提供确切的定义,以示例的方式实现是不够的。
约翰·德沃夏克

1
Timeago是某种新的脚本语言吗?每30秒更新一次是可选的(如某处所述)还是一项要求(如另一处所述)?可以接受哪些I / O机制?应该使用什么取整?尤其是,舍入如何与可变长度的时间段(例如日历月份和年份)相互作用?其中一些可能暗示后续问题,具体取决于您的答案。
彼得·泰勒

1
@Abdossam我知道我们似乎都非常挑剔,但这是因为该站点上的问题应该具有客观的获胜标准 明确的规格
加尔文的爱好2014年

1
有两个建议:1)省略HTML部分。我猜没有人愿意在能够解决打印时间的实际任务之前编写HTML解析器。2)明确限制为“秒”,“分钟”,“小时”和“天”。如果愿意,可以添加“周”。但是没有明确定义月份和年份(28-31天/ 365或366天...)。在我看来,这应该解决该问题的主要问题。
Falko 2014年

Answers:


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

165

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

可能可以打更多的高尔夫球。使用迄今为止的shell调用来获取当前的unix时代,因为Unix时代在J中不可用。

示例运行:

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


您不应该使用粗箭头符号吗?
骄傲的haskeller 2014年

@ user965091请避免通过对无关帖子的公开评论而无端提出指控。如果您认为有人在使用袜子帐户,请标记其帖子以引起主持人注意。我绝对没有理由怀疑这里有什么伪造的东西,即使有,也不应该在公共场合进行这样的讨论。
门把手

@ 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年

gh,忘了秒,谢谢@IngoBürk。要明确它t(new Date()/1000 + 10);
胜利

使用ES6的粗箭头表示法,也eval(i)比短2个字节window[i]
nyuszika7h 2014年

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.