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.