web-dev-qa-db-fra.com

Comment puis-je ajouter deux semaines à Time.now?

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
36
Josh Brown

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

64
J-_-L

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
52
Laas
require 'rubygems'
require 'active_support/core_ext/numeric/time'
self.expires = 2.weeks.from_now
20
Alex Wayne

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)
20
Felipe Sabino

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
19
oylenshpeegul
<%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
%>
2
Rockers Technology

Vous pouvez utiliser ces 3 modèles

# 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
1
jamy

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.

0
three