到这个日期要多久?


11

想法是这样的:编写一个函数以打印从现在/今天的日期(调用函数时)到作为参数提供的日期为止的时间长度。

假设:

  • 输入日期将始终是明天或更晚。
  • 输入日期永远不会超过10年。

规则:

  • 输出必须采用以下格式:“ [z年],[x月],y天,直到-Input Date-”
  • 输出时间范围(日/月/年)必须正确地复数。即1 month,不是1 months
  • 输入可以采用喜欢的任何日期格式(2012年3月15日-2012年3月15日-2012.03.15)。

示例: 假设程序在2012年3月15日运行:

  • 输入日期3/20/12=5 days until 3/20/12
  • 输入日期4/16/12=1 month, 1 days until 3/20/12
  • 输入日期2012.04.20=1 month, 5 days until 2012.04.20
  • 输入日期2012.04.20=36 days until 2012.04.20
  • 输入日期10/31/17=5 years, 7 months, 16 days until 10/31/17
  • 输入日期3/15/13=1 year until 3/15/13

这是代码高尔夫球,因此最短的代码获胜。

我想为了有一个截止日期,我将选择一个答案:

2012年3月23日!

(这是我的第一个CG问题,因此,我很乐意更正我的所有问题错误!)


3
Wolfram | Alpha 10个字符:: now until <input time> p
Griffin 2012年

3
@Griffin 4个字符:now-<input time>
PhiNotPi 2012年

1
@PhiNotPi表现出色,先生。
格里芬2012年

2
可以说“ 1天,直到3/16/12”吗?
MrZander 2012年

1
如何与Jump yeras一起工作?再过10年就会出现2天的错误。一个月多长时间?
Hauleth 2012年

Answers:


3

R,99个字符

我知道这有点作弊,但是R只是关于它的包,而lubridate对于此类任务是如此方便!

f=function(x){library(lubridate);cat(show(as.period(interval(mdy("3/15/2012"),mdy(x)))),"until",x)}

用法:

f("10/31/2017")
[1] 5 years, 7 months and 16 days 
5 years, 7 months and 16 days  until 10/31/2017

1

PHP,315个字符

function p($z)
{
list($d,$m,$y)=explode("/",$z);
$d=$d-date("d");
$n=$m-1;
$m=$m-date("m")-($d<0);
$d=$d+($d<0)*($n>7^$n&1)+27+($n-2?3:($y%4?1:($y%100?2:($y%400?1:2))));
$y=$y-date("Y")-($m<0);
$s="s ";
echo ($y?$y." year".$s[$y<2]:"")." ".($m?$m." month".$s[$m<2]:"")." ".($d?$d." day".$s[$d<2]:"")." until ".$z;
}

用法:

p("11/03/2006");

采取dd/mm/yyyy格式的日期。我使用了Griffin的月份长度计算(再次),尽管我不得不在其中加上多余的括号以使优先级正常工作。我还保留了一些换行符,以使其更易于阅读。


1

红宝石(213)

接受任何格式的日期Date.parse。试过了yyyy-mm-dd

def u s
t=Date.today
f=Date.parse s
[[0,'year'],[0,'month'],[0,'day']].map{|c,n| while t<f 
c+=1
t=t.send"next_#{n}"
end
c,t=c-1,t.send("prev_#{n}")if t>f
[c,n+(c>1??s:'')]*' 'if c>0}.compact*', '+' until '+s
end

要获得几周的时间,请添加:

['prev_','next_'].each{|n|Date.send(:define_method,n+'week'){send n+'day',7}}

[0,'week'],(在月份和日期之间)。天将永远是< 7


您正在使用哪个版本的Ruby。...我试图在ruby1.9.2p0上运行您的代码,但它给了我错误uninitialized constant Object::Date (NameError)...我认为您使用的是Rails Date
Rohit 2012年

@Rohit 1.9.3,不使用Rails的东西。日期rdoc
jsvnm 2012年

我早些时候看过文档..但是对我得到的错误感到困惑...我仍然无法弄清楚为什么我得到这个错误。我使用的是Windows 7 64位,ruby192p0
Rohit

@rohit尝试193吗?
jsvnm 2012年

1

VBA:766631个字符

感谢mellamokb帮助缩短了字符串的创建和处理时间IIf

Function k(i)
e=" month"
g="s"
n=Now()
r=Month(n)
s=Month(i)
t=DateSerial(Year(i),s,1)
u=DateSerial(Year(i),s-1,1)
v=Day(n)
w=Day(i)
x=DateSerial(Year(n),r,1)
d=t-u-v+w
For y=0 To 10
If Year(DateAdd("yyyy",-1*y,i))=Year(n) Then Exit For
Next
y=IIf(s=1,y-1,y)
z=s-r
z=IIf(z<0,z+12,z)
For m=0 To z
If Month(DateAdd("m",-1*m,i))=r Then Exit For
Next
d=IIf(v<=w,w-v,d)
m=IIf(v>w,m-1,m)
If y Then a=y & " year" & Left(g,y-1)
a=IIf((m Or d) And y,a & ",",a)
If m Then b=IIf(d,m & e & Left(g,m-1) & ",",m & e & Left(g,m-1))
If d Then c=IIf(d>1,d & " days",d & " day")
k=Trim(Trim(a & " " & b) & " " & c) & " until " & i & "."
End Function

我知道VBA绝对不会像其他一些语言一样编写高尔夫代码,但这就是我擅长的(不是专家)。:-)

这对我来说是一个有趣的练习!


1
并非完全是VBA的错,有一些很好的方法可以在您的代码中组合逻辑:)例如,If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"可以组合为a = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb很好。我会看一看然后重新发布!
加菲2012年

我有一个问题与一些测试情况下,即1 year1 month1 day。我已经在答案中更正了这一点。它实际上是为了缩短代码!
加菲2012年

发布更新后,我发现可以更改If v < w Then d = w - v:If v = w Then d = 0If v <= w Then d = w - v,以节省另外20个字符。如果要发布的内容有更重要的更改,我将更新答案。
加菲2012年

我想我可以使用数组做得更好……我会再看一看,并可能添加另一个答案……
Gaffi 2012年

1

JavaScript(ES6),125个字节

由于Paolo的答案使用了外部库,因此我将做同样的事情。Node.js完全是关于NPM软件包的,时刻 + HumanizeDuration如此方便!

节点环境

m=require('moment'),f=d=>console.log(require('humanize-duration')(m(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

浏览器环境

由于库声明了全局变量,因此实际上要短一些(102字节)。目前尚不清楚我是否需​​要在第三方JavaScript中包含加载所需的脚本标签,因此我将正式将Node计数为1。

f=d=>console.log(humanizeDuration((m=moment)(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

CoffeeScript,也是125个字节

f=(d)->console.log require('humanize-duration')((m=require 'moment')(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d

1

PHP,151个字符

function p($z){$n=date_create(date('Y-m-d'));$d=date_create($z);$i=date_diff($n,$d);print($i->format('%R%y years, %m months, and %a days until '.$z));}

它缺少复数并且不能正确计数,因为format()不会从月份中减去天数...我也有一个类似的PHP解决方案。
powtac

这是我的PHP解决方案,但仍然缺少前面提到的错误:echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');在命令行上调用时,其长度为92个字符。
powtac
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.