Combien de temps jusqu'à cette date?

11

L'idée est la suivante: Écrivez une fonction pour imprimer la durée entre la date actuelle et la date d'aujourd'hui (au moment où la fonction est appelée) jusqu'à une date fournie en argument.

Hypothèses:

  • La date d'entrée sera toujours demain ou plus tard, à l'avenir.
  • La date d'entrée ne sera jamais supérieure à 10 ans dans le futur.

Règles:

  • La sortie doit être dans ce format: "[z année (s)], [x mois (s)], y jour (s) jusqu'à -Date d'entrée-"
  • La période de sortie (jour / mois / année) doit être correctement pluralisée. c'est-à 1 month- dire pas1 months
  • L'entrée peut être dans le format de date que vous préférez (15/03/12 - 15 mars 2012 - 15/03/2012).

Exemple: en supposant que le programme est exécuté le 15 mars 2012:

  • Date d'entrée de 3/20/12=5 days until 3/20/12
  • NON Entrez la date de 4/16/12=1 month, 1 days until 3/20/12
  • Date d'entrée de 2012.04.20=1 month, 5 days until 2012.04.20
  • NON Entrez la date de 2012.04.20=36 days until 2012.04.20
  • Date d'entrée de 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • Date d'entrée de 3/15/13=1 year until 3/15/13

C'est le golf par code, donc le code le plus court gagne.

Je suppose que pour avoir un délai, je sélectionnerai une réponse sur:

23 mars 2012!

(Ceci est ma première question CG, donc je serai heureux de corriger toute erreur de question de ma part!)

Gaffi
la source
3
Wolfram | Alpha 10 caractères:: now until <input time> p
Griffin
3
@Griffin 4 caractères:now-<input time>
PhiNotPi
1
@PhiNotPi bien joué, bon monsieur.
Griffin
2
Est-il correct de dire "1 jours jusqu'au 16/03/12"?
MrZander
1
Comment travailler avec leap yeras en réponse? Dans 10 ans, il y aura alors une erreur de 2 jours. Combien de temps dure le mois?
Hauleth

Réponses:

3

R, 99 caractères

Je sais que c'est une sorte de tricherie, mais R est tout au sujet de ses paquets et la lubrification est si pratique pour ce genre de tâches!

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

Usage:

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

PHP, 315 caractères

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

Usage:

p("11/03/2006");

Prend les dates dans un dd/mm/yyyyformat. J'ai utilisé le calcul de la durée du mois de Griffin ( encore une fois ), même si j'ai dû y coller des crochets supplémentaires pour que la priorité fonctionne correctement. J'ai également laissé quelques sauts de ligne pour le rendre un peu plus facile à lire.

Gareth
la source
1

Rubis (213)

prend des dates dans n'importe quel format Date.parseaccepte. Essayé juste avecyyyy-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

pour obtenir également des semaines, ajoutez:

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

et [0,'week'],(entre le mois et le jour). les jours seront alors toujours< 7

jsvnm
la source
quelle version de ruby ​​utilisez-vous .... J'ai essayé d'exécuter votre code sur ruby1.9.2p0, mais cela me donne une erreur uninitialized constant Object::Date (NameError)... Je pense que vous utilisez la Dateclasse Rails
Rohit
@Rohit 1.9.3, n'utilisant pas les trucs Rails. Date rdoc
jsvnm
J'ai vu le document plus tôt ... mais j'étais confus quant à l'erreur que j'obtenais ... Je n'arrive toujours pas à comprendre pourquoi j'obtiens cette erreur. Je suis sous Windows 7 64 bits, ruby192p0
Rohit
@rohit essayer avec 193?
jsvnm
1

VBA: 766 631 Chars

Merci à mellamokb d' avoir aidé à raccourcir la création de chaîne et 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

Je sais que VBAcela ne se prête certainement pas au golf de code ainsi qu'à d'autres langages, mais c'est ce que je suis bon (pas expert). :-)

Cela a été un exercice amusant pour moi!

Gaffi
la source
1
Ce n'est pas entièrement la faute de VBA, il existe de bonnes façons de combiner la logique dans votre code :) Par exemple, If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"pourrait être combiné ensemble poura = y & " year" & Left("s", y - 1) & ","
mellamokb
@mellamokb Très bien. Je vais y jeter un œil et republier!
Gaffi
J'ai eu un problème avec certains cas de test, à savoir 1 year, 1 month, 1 day. J'ai corrigé cela dans la réponse. En fait, cela a rendu le code plus court!
Gaffi
Et après avoir publié la mise à jour, je vois que je peux changer If v < w Then d = w - v:If v = w Then d = 0à If v <= w Then d = w - vpour une économie d'un 20 caractères supplémentaires. Je mettrai à jour la réponse si j'ai un changement plus important à publier.
Gaffi
J'imagine que je peux mieux faire cela avec des tableaux ... Je vais jeter un autre regard et ajouter éventuellement une autre réponse ...
Gaffi
1

JavaScript (ES6), 125 octets

Puisque la réponse de Paolo a utilisé une bibliothèque externe, je ferai de même. Node.js est tout au sujet des packages NPM et moment + HumanizeDuration est si pratique pour cette tâche!

Environnements de nœuds

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

Environnement de navigateur

Étant donné que les bibliothèques déclarent des variables globales, il est en fait un peu plus court (102 octets). Il n'est pas clair si je dois inclure les balises de script nécessaires au chargement dans le JavaScript tiers, donc je compte officiellement le nœud.

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

CoffeeScript, également 125 octets

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

PHP, 151 caractères

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));}
Conor
la source
Il manque les pluriels et ne compte pas correctement, car format () ne soustrait pas les jours des mois ... J'avais aussi une solution similaire avec PHP.
powtac
C'est ma solution PHP, mais il manque toujours l'erreur mentionnée précédemment: echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');ses 92 caractères de long, lorsqu'elle est appelée sur la ligne de commande.
powtac