Comment puis-je ajouter deux semaines au Time.now actuel dans Ruby? J'ai un petit projet Sinatra qui utilise DataMapper et avant de sauvegarder, j'ai un champ rempli avec l'heure actuelle PLUS deux semaines, mais qui ne fonctionne pas correctement. Toute aide est grandement appréciée! Je reçois l'erreur suivante:
NoMethodError at /
undefined method `weeks' for 2:Fixnum
Voici le code pour le modèle:
class Job
include DataMapper::Resource
property :id, Serial
property :position, String
property :location, String
property :email, String
property :phone, String
property :description, Text
property :expires_on, Date
property :status, Boolean
property :created_on, DateTime
property :updated_at, DateTime
before :save do
t = Time.now
self.expires_on = t + 2.week
self.status = '0'
end
end
Vous n'avez pas d'aides de ce genre en plaine Ruby. Vous pouvez ajouter des secondes:
Time.now + (2*7*24*60*60)
Mais, heureusement, il existe de nombreuses bibliothèques de date (ou construisez la vôtre;))
Ruby Date
class a methods pour ajouter des jours et des mois en plus des secondes dans Time . Un exemple:
require 'date'
t = DateTime.now
puts t # => 2011-05-06T11:42:26+03:00
# Add 14 days
puts t + 14 # => 2011-05-20T11:42:26+03:00
# Add 2 months
puts t >> 2 # => 2011-07-06T11:42:26+03:00
# And if needed, make Time object out of it
(t + 14).to_time # => 2011-05-20 11:42:26 +0300
require 'rubygems'
require 'active_support/core_ext/numeric/time'
self.expires = 2.weeks.from_now
Vous devez utiliser les secondes pour effectuer le calcul entre les dates, mais vous pouvez utiliser la classe Time comme aide pour obtenir les secondes à partir des éléments de pièce de date.
Time.now + 2.week.to_i
EDIT: Comme mentionné par @iain, vous aurez besoin de Active Support pour utiliser 2.week.to_i
. Si vous ne pouvez pas (ou ne voulez pas) avoir cette dépendance, vous pouvez toujours utiliser l'opérateur +
pour ajouter des secondes à une instance Time
( heure + numérique → heure docs ici )
Time.now + (60 * 60 * 24 * 7 * 2)
Je pense que week/weeks
est défini dans l'extension active support numeric
$ Ruby -e 'p Time.now'
2011-05-05 22:27:04 -0400
$ Ruby -r active_support/core_ext/numeric -e 'p Time.now + 2.weeks'
2011-05-19 22:27:07 -0400
<%current_time=Time.now
current_time_s=current_time.strftime('%Y-%m-%d %H:%M:%S').to_s #show currrent date time
current_time= Time.now + (60 * 60 * 24 * 7 * 250)
current_time_e=current_time.strftime('%Y-%m-%d %H:%M:%S').to_s #show datetime after week
%>
# you have NoMethod Error undefined method
require 'active_support/all'
# Tue, 28 Nov 2017 11:46:37 +0900
Time.now + 2.weeks
# Tue, 28 Nov 2017 11:46:37 +0900
Time.now + 2.week
# Tue Nov 28 11:48:24 +0900 2017
2.weeks.from_now
J'aime le mien aussi :)
def minor?(dob)
n = DateTime.now
a = DateTime.parse(dob)
a >> 12*18 > n
end
Vous évite d'avoir à penser aux années bissextiles et aux secondes. Ça marche hors de la boîte.