11
votes

Dans Ruby, 12.Antes! = 1. Anglais

Les aides de date / heure de Ruby sont utiles mais j'ai trouvé une divergence. Il semble que 12.Anths ne soit pas égal à 1. Anglais. Vérifiez 1.Month et vous trouverez qu'il est égal à 30.days et, bien sûr, 12 * 30.days = 360.days, 5,25 jours après une longueur d'année réelle.

Je suis tombé sur ce moment à certains composants de notre site Web basé sur le nombre de mois accordés, comme spécifié par le client. J'ai découvert qu'un terme de 36. Month a expiré deux semaines au début de la course à mes tests. La solution était quelque chose comme ceci: xxx

Ceci renvoie le nombre de secondes dans une fraction d'une année est représentée par les numéros_of_months.

depuis 1. L'année est égale en quelques secondes à 365,25 jours, pourquoi supposons-vous qu'ils n'avaient pas de 1/11 retournent les secondes pendant 1/12 de l'année au lieu de 30 jours au lieu de 30 jours?

a-t-il déjà eu lieu à travers cela avant? Est-ce que quelqu'un a une meilleure solution?


1 commentaires

Sans rapport, mais vous n'avez pas besoin de ce to_f appelé là-bas; Il suffit de diviser par 12.0 .


4 Réponses :


25
votes

Le calendrier et le temps en général, est une chose aussi arbitraire et est criblée d'incohérences comme celle-ci. Il n'y a pas de longueur standard de "mois", car la variation est entre 28 et 31 jours, tout comme il n'y a pas de longueur standard de "jour", qui peut être de 23 à 25 heures, et même la minute peut avoir n'importe quoi de 59 à 62 secondes lorsque des "secondes saut" sont prises en compte. De même par an peut être 365 ou 366 jours, voire 351, comme c'était le cas en 1582.

Sauf si vous faites des calculs spécifiques à un intervalle particulier, comme le nombre de secondes entre le 3 janvier 2010 et le 19 octobre 2011, vous ne serez pas en mesure de savoir combien de temps l'intervalle utilise des mois, des jours ou des jours. années. Ces choses dépendent d'un grand nombre de facteurs.

Votre solution convient à votre application, mais dans les rations, un "mois" est tout simplement de 30 jours pour la simplicité, tout comme une "journée" est de 24 heures.


2 commentaires

+ 1 pour cela. Nous avons rencontré des problèmes similaires que l'OP lors du codage de la logique pour notre application. Fondamentalement, vous devez vous rendre compte que ces unités de temps malheureusement ne se lèvent malheureusement pas en raison de leur nature même, donc si vous faites des conversions bewteen hebdomadaires, des calculs mensuels ou quelque chose, vous allez simplement avoir à accepter les choses seront une approximation et utiliser une méthode de conversion cohérente (par exemple, toujours convertir au non-des jours d'abord)


C'est triste qu'un second n'est même pas 1/60 d'une minute. Dang ces atomes de césium et plus vite que les voyages légers.



0
votes

1 an est composé de 12 mois individuels, mais plusieurs de ces mois sont des tailles différentes. Étant donné qu'un mois peut réellement être des 28, 29, 30 ou 31 jours civils, il est raisonnable de s'attendre à ce que toute définition donnée de la durée d'un mois peut ne pas être ce que l'on veut.

Personnellement, j'utilise 4 semaines comme définition d'un mois dans la plupart des cas. Dans ce cas, où vous accordez un accès pour «un mois», je serais enclin à stocker le jour de l'accès au mois. Ensuite, prenez le numéro du mois et mettez l'expiration le même jour du mois N Numéros de mois plus tard.


1 commentaires

En d'autres termes, n'utilisez pas la / la longueur / du mois pour quoi que ce soit; Utilisez le nombre du mois.



0
votes
require 'date'

expire_date = Date.today >> 36
puts expire_date #=> 2013-11-12
If you want to subtract months, use << .

0 commentaires

9
votes

Oui et non:

12 mois code> sont identiques que 1 an code> lorsque vous les utilisez comme intervalles relatifs, car ils ne sont pas convertis en secondes, puis: xxx pré>

interne, ces intervalles sont conservés en tant que réseaux de nombre d'années, de mois et de jours, donc si vous dites, par exemple: P>

1.year - 12.months
#=> 1 year and -12 months


0 commentaires