Quanto tempo fino a questa data?


11

L'idea è questa: scrivere una funzione per stampare l'intervallo di tempo da oggi / data odierna (al momento in cui viene chiamata la funzione) fino a una data fornita come argomento.

ipotesi:

  • La data di inserimento sarà sempre domani o più tardi, in futuro.
  • La data di inserimento non sarà mai più di 10 anni in futuro.

Regole:

  • L'output deve essere in questo formato: "[z year (s)], [x month (s)], y day (s) fino a -Input Date-"
  • L'intervallo di tempo di uscita (giorno / mese / anno) deve essere correttamente pluralizzato. cioè 1 monthno1 months
  • L'input può essere nel formato data che preferisci (15/03/12 - 15 marzo 2012 - 2012/03/15).

Esempio: supponendo che il programma venga eseguito il 15 marzo 2012:

  • Data di inserimento di 3/20/12=5 days until 3/20/12
  • NON Inserire la data di 4/16/12=1 month, 1 days until 3/20/12
  • Data di inserimento di 2012.04.20=1 month, 5 days until 2012.04.20
  • NON Inserire la data di 2012.04.20=36 days until 2012.04.20
  • Data di inserimento di 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • Data di inserimento di 3/15/13=1 year until 3/15/13

Questo è il codice golf, quindi vince il codice di lunghezza più breve.

Suppongo, per motivi di scadenza, selezionerò una risposta su:

23 marzo 2012!

(Questa è la mia prima domanda CG, quindi sarò felice di correggere eventuali errori di domanda da parte mia!)


3
Wolfram | Alpha 10 caratteri:: now until <input time> p
Griffin

3
@Griffin 4 caratteri:now-<input time>
PhiNotPi

1
@PhiNotPi ben suonato, bravo signore.
Griffin,

2
Va bene dire "1 giorni fino al 16/03/12"?
MrZander

1
Come lavorare con le macchine fotografiche bisestili in risposta? Tra 10 anni ci saranno 2 giorni di errore. Quanto dura il mese?
Hauleth

Risposte:


3

R, 99 caratteri

So che è una specie di imbroglio, ma R è tutto incentrato sui suoi pacchetti e lubridate è così conveniente per questo tipo di attività!

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

Uso:

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 caratteri

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

Uso:

p("11/03/2006");

Prende le date in un dd/mm/yyyyformato. Ho usato (di nuovo ) il calcolo della lunghezza del mese di Griffin , anche se ho dovuto inserire parentesi extra per far funzionare correttamente la precedenza. Ho anche lasciato alcune interruzioni di riga per rendere un po 'più facile la lettura.


1

Rubino (213)

accetta date in qualsiasi formato Date.parseaccetta. Ho provato solo conyyyy-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

per ottenere anche settimane, aggiungi:

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

e [0,'week'],(tra mese e giorno). i giorni saranno sempre così< 7


quale versione di ruby ​​stai usando .... Ho provato ad eseguire il tuo codice su ruby1.9.2p0, ma mi dà un errore uninitialized constant Object::Date (NameError)... Penso che tu stia usando la Dateclasse Rails
Rohit

@Rohit 1.9.3, non usando roba Rails. Data rdoc
jsvnm,

Ho visto il documento in precedenza .. ma ero confuso sull'errore che stavo riscontrando ... Non riesco ancora a capire perché ricevo questo errore. Sono su Windows 7 a 64 bit, ruby192p0
Rohit

@rohit provare con 193?
jsvnm,

1

VBA: 766 631 Chars

Grazie a mellamokb per aver contribuito ad abbreviare la creazione di stringhe e 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

So che VBAsicuramente non si presta al golf del codice così come ad altre lingue, ma è ciò in cui sono bravo (non esperto). :-)

Questo è stato un esercizio divertente per me!


1
Non è interamente colpa di VBA, ci sono alcuni buoni modi per combinare la logica nel tuo codice :) Ad esempio, If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"potrebbero essere combinati insieme aa = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb Molto bene. Lo guarderò e ripubblicherò!
Gaffi,

Ho avuto un problema con alcuni casi di test, vale a dire 1 year, 1 month, 1 day. Ho corretto questo nella risposta. In realtà ha fatto per il codice più breve!
Gaffi,

E dopo aver pubblicato l'aggiornamento, vedo che posso passare If v < w Then d = w - v:If v = w Then d = 0a If v <= w Then d = w - vper un risparmio di altri 20 caratteri. Aggiornerò la risposta se avrò una modifica più significativa da pubblicare.
Gaffi,

Immagino di poterlo fare meglio con le matrici ... Daremo un'altra occhiata e forse aggiungerò un'altra risposta ...
Gaffi

1

JavaScript (ES6), 125 byte

Poiché la risposta di Paolo utilizzava una biblioteca esterna, farò lo stesso. Node.js è tutto basato sui pacchetti NPM e moment + HumanizeDuration è così conveniente per questo compito!

Ambienti nodo

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

Ambiente del browser

Poiché le librerie dichiarano variabili globali, in realtà è un po 'più breve (102 byte). Non è chiaro se devo includere i tag di script richiesti per caricare nel JavaScript di terze parti, quindi conterò ufficialmente il nodo.

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

CoffeeScript, anche 125 byte

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

1

PHP, 151 caratteri

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

Manca i plurali e non conta correttamente, perché format () non sottrae i giorni dai mesi ... Avevo una soluzione simile anche con PHP.
powtac,

Questa è la mia soluzione PHP, ma manca ancora dell'errore menzionato in precedenza: i echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');suoi 92 caratteri sono lunghi, quando vengono chiamati sulla riga di comando.
powtac,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.