Retornar diferença entre datas?

1,668 views
Skip to first unread message

Tiago Garcia

unread,
Feb 6, 2012, 3:23:29 AM2/6/12
to Rails
Falae galera.

Preciso retornar a diferença entre dias de duas datas, incluido diferença entre meses.

exemplo, 28/02/2012 a 05/03/2012 sao 5 dias, mudando de mes.

tem alguma função pronta pra isso?

além disso depois ainda vou ter de calcular qtos destes dias retornados, sao dia de seman e fim de semana(sab e dom).

:D

Adriano Tadao

unread,
Feb 6, 2012, 5:20:16 AM2/6/12
to rail...@googlegroups.com
Usa isso aqui cara ...

é uma gem bem simples que vai te retornar tudo isso ai.


ele te retorna diferenças até do ano se for o caso hehehe

abra;cos

2012/2/6 Tiago Garcia <tiag...@gmail.com>

--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7



--
Adriano Tadao

e-mail / gtalk: drian...@gmail.com
skype: adriano.matsumoto
twitter: @adrianotadao
Cel.: +55 (18) 9113-5105

Rogerio Medeiros

unread,
Feb 6, 2012, 6:15:51 AM2/6/12
to rail...@googlegroups.com
so colocar data final - data inicial o rails ja faz isso
att,

Rogerio

A complicação se descomplica na mesma proporção que fazemos os nós se desatarem ao tecer o conhecimento do saber.

Adriano Tadao

unread,
Feb 6, 2012, 6:47:01 AM2/6/12
to rail...@googlegroups.com
Ele da todas essas informações de horas diferencias, minutos, segundos, semanas, meses, anos?

2012/2/6 Rogerio Medeiros <arg...@gmail.com>

Luiz Augusto B. Florentino Filho

unread,
Feb 6, 2012, 7:00:21 AM2/6/12
to rail...@googlegroups.com
Só lembrando que 2012 é ano bissexto. Desta forma 05/03/2012 - 28/02/2012 = 6 dias.

Everaldo Gomes

unread,
Feb 6, 2012, 7:22:33 AM2/6/12
to rail...@googlegroups.com
Deve ter jeito melhor de fazer, mas seguem umas brincadeirinhas no console do Rails:

ruby-1.9.2-p290 :002 > d1 = Date.new(2012,3, 5)
 => Mon, 05 Mar 2012 
ruby-1.9.2-p290 :003 > d2 = Date.new(2012,2, 28)
 => Tue, 28 Feb 2012 
ruby-1.9.2-p290 :005 > d1 - d2
 => (6/1) 
ruby-1.9.2-p290 :007 > (d2..d1).to_a.size
 => 7   
ruby-1.9.2-p290 :008 > (d2...d1).to_a.size                                                                                                                                                      
 => 6 
ruby-1.9.2-p290 :014 > (d2...d1).to_a.select { |d| ! (d.saturday? || d.sunday?) }.size
 => 4 


2012/2/6 Luiz Augusto B. Florentino Filho <luizflo...@gmail.com>

Josué Teixeira

unread,
Feb 6, 2012, 7:45:01 AM2/6/12
to rail...@googlegroups.com
d1 = Date.new(2012,3, 10)
d2 = Date.new(2012,3, 5)

diff = (d1 - d2).to_i

diff => 5             #5 dias


Em 6 de fevereiro de 2012 10:22, Everaldo Gomes <everald...@gmail.com> escreveu:
Deve ter jeito melhor de fazer, mas seguem umas brincadeirinhas no console do Rails:

ruby-1.9.2-p290 :002 > d1 = Date.new(2012,3, 5)
 => Mon, 05 Mar 2012 
ruby-1.9.2-p290 :003 >d1 = Date.new(2012,3, 5)



--
Sem mais,

Josué Teixeira

Marcos Tapajós

unread,
Feb 6, 2012, 7:49:47 AM2/6/12
to rail...@googlegroups.com
O Rails tem um módulo com uns métodos que pode te ajudar. Dá uma olhada no ActionView::Helpers::DateHelper.

-- 
Marcos Tapajós
Mobile: +55 21 8709-8693
Skype: marcostapajos
Gtalk/MSN: tap...@gmail.com
Twitter: tapajos

Sent with Sparrow

Tiago Garcia

unread,
Feb 6, 2012, 1:07:37 PM2/6/12
to rail...@googlegroups.com
Obrigado a todos.

Deu certo todas as formas que me passaram.

Estranho que ontem eu ja tinha tentado isso no irb.

d1 = Date.today
d2 = Date.tomorrow
r = d2 - d1, dava um erro.

hoje fiz igual e retorna (1/1)
se colocar .to_i = 1

A gem tambem muito legal, vai ser muito util.

Abraços

Everaldo Gomes

unread,
Feb 6, 2012, 1:26:59 PM2/6/12
to rail...@googlegroups.com
No irb não funciona, são métodos providos pelo Rails (acessíveis pelo console rails: rails c)

2012/2/6 Tiago Garcia <tiag...@gmail.com>

Tiago Garcia

unread,
Feb 6, 2012, 1:35:05 PM2/6/12
to rail...@googlegroups.com
Viajei, no rails console mesmo que testei. mas agora ta ok.

To aqui pensando em como implementar as regras pra consulta de diaria em hotel

to quebrando em partes, pra ficar mais facil.

Everaldo Gomes

unread,
Feb 6, 2012, 1:57:31 PM2/6/12
to rail...@googlegroups.com
Você viu se esse link tem algo que te serve?

Tiago Garcia

unread,
Feb 6, 2012, 2:11:27 PM2/6/12
to rail...@googlegroups.com
Everaldo, li e nao consegui entender direito, ou seja, nao consegui ver como posso utuliza-lo para meu caso. mas irei ler ate ver se entendo. :)


mas dentro deste mesmo contexto desse post.

to com 2 novos problemas agora com as datas.

ao tentar pegar um objeto com were, passando a data, retorna esse errro. '{:day=>1}.}(3i)'

achei que qdo vc passava um date_select pro rails, ele convertia pra date 1

outro erro, ao tentar criar um novo formulario...o campo date_select, que ira receber a nova data, tambem nao converte e da esse mesmo tipo de erro.

Everaldo Gomes

unread,
Feb 6, 2012, 2:13:53 PM2/6/12
to rail...@googlegroups.com
Você está pulando algum passo intermediário.

Tiago Garcia

unread,
Feb 6, 2012, 3:51:55 PM2/6/12
to rail...@googlegroups.com
nao sei o que fiz de errado

so consegui resolver assim.

Tarifa.where(:hotel_id => params[:reserva][:hotel_id],
                          :inicio => "#{params[:reserva]["entrada(1i)"] +'/'+ params[:reserva]["entrada(2i)"]+'/'+ params[:reserva]["entrada(3i)"]}" )

agora, pra criar, li que é seguindo a mesma logica.

http://apidock.com/rails/ActionView/Helpers/DateHelper/date_select#1175-Parsing-the-Date-Params-into-a-New-Date-Object-

alguem tem um codigo menor, mais limpo?

Everaldo Gomes

unread,
Feb 6, 2012, 4:15:03 PM2/6/12
to rail...@googlegroups.com
Nunca trabalhei com datas, mas pelo que vi dos tutoriais, seria assim.

Substitua:

 "#{params[:reserva]["entrada(1i)"] +'/'+ params[:reserva]["entrada(2i)"]+'/'+ params[:reserva]["entrada(3i)"]}"

Por:

"#{params[:reserva][:entrada]}"

Att.
Everaldo

2012/2/6 Tiago Garcia <tiag...@gmail.com>

Tiago Garcia

unread,
Feb 6, 2012, 4:35:53 PM2/6/12
to rail...@googlegroups.com
Ja testei assim, ele traz nil.

por isso, tive de user essa solução.

segundo o manual,

which results in a params hash like

{:person => {'birth_date(1i)' => '2008', 'birth_date(2i)' => '11', , 'birth_date(2i)' => '11', 'birth_date(3i)' => '22'}}

Everaldo Gomes

unread,
Feb 6, 2012, 4:41:04 PM2/6/12
to rail...@googlegroups.com
Leia nas próximas linhas do manual, onde ele diz que o Rails se encarrega de construir o objeto date.

Eu percebi que você estava usando barras / , para separar dia, mês, ano, mas acho que dá para consultar o banco direto com um objeto Date.

Dedique-se a construir esse objeto a partir do params hash, depois vai ser fácil fazer a consulta.

Att.

2012/2/6 Tiago Garcia <tiag...@gmail.com>

Tiago Garcia

unread,
Feb 6, 2012, 5:31:55 PM2/6/12
to rail...@googlegroups.com
Everaldo,

onde ta isso? nao achei.

Separei por /, pois o banco aceita / ou - para consulta.

Mas a ideia inicial era deixar ele mesmo construir as datas pra consulta e datas pro novo form.

o params dele vem assim:

 Parameters: {"utf8"=>"✓", "reserva"=>{"hotel_id"=>"1", "entrada(3i)"=>"6", "entrada(2i)"=>"2", "entrada(1i)"=>"2012", "saida(3i)"=>"7", "saida(2i)"=>"2", "saida(1i)"=>"2012", "adultos"=>"1", "criancas_free"=>"", "criancas_pagas"=>""}, "Submit2"=>"Consultar"}

Everaldo Gomes

unread,
Feb 6, 2012, 5:54:42 PM2/6/12
to rail...@googlegroups.com
Oi!

Olhe na seção 4.2


Eu nunca usei esses helpers, é que estava lendo ontem sobre eles porque alguém perguntou na lista internacional.

Tiago Garcia

unread,
Feb 7, 2012, 12:25:38 AM2/7/12
to rail...@googlegroups.com
Mas é essa seção que olhei. e nao entendi

traduz pro noobez. que dai ajuda. kkk

Everaldo Gomes

unread,
Feb 7, 2012, 5:28:11 AM2/7/12
to rail...@googlegroups.com
Oi! É aquilo que te falei antes.

O Rails é inteligente o suficiente para saber detectar os campos com (1i) (2i) e (3i) e construir o objeto Date para você.

Você não precisa fazer, por exemplo, params[:user][:data(1i)] , params[:user][:data(2i)] , params[:user][:data(3i)].

Olha a explicação do guia:

When this is passed to Person.new (or update_attributes), Active Record spots that these parameters should all be used to construct the birth_date attribute and uses the suffixed information to determine in which order it should pass these parameters to functions such asDate.civil.

Vou fazer uma tradução "porca":

Quando esses parâmetros são passados para Person.new o(ou update_attributes), Active Record percebe que esses parâmetros devem ser usados para construir o atributo birth_date e usa as informações dos sufixos (as informações dos sufixos são (1i), (2i) e (3i)) para determinar em qual ordem esses parâmetros devem ser passados para funções como Date.civil.

Concluindo:

Bom, percebi que se você não estiver usando uma função new ou update_attributes tem que fazer manualmente como você fez. Tem como mandar de novo o código do Controller e da consultado Model?



2012/2/7 Tiago Garcia <tiag...@gmail.com>

Tiago Garcia

unread,
Feb 7, 2012, 12:30:54 PM2/7/12
to rail...@googlegroups.com
Como estou tentando usar o padrão pra facilitar pra mim claro, vai ser muito util quando eu precisar rescontruir o objeto, no caso Reserva.new, vai receber os params, e espero que ele faça essa construção.

na consulta, esta pronto entao, pelo que vimos.

Tem como passar novamente, eles estao guardados no params, entao posso usar-los novamente.

estou usando essa função pra verificar se a data é valida.

Date.valid_civil?, retorna true na data que passo.

Essa pra saber se retornou mais q uma tarifa.
@tarifa.to_a.size

pra saber se é fim de semana, vou usar assim dentro de um case:
.strftime('%A')

vao ser n funçoes, até conseguir calcular essa tarifa.

Everaldo Gomes

unread,
Feb 7, 2012, 12:41:17 PM2/7/12
to rail...@googlegroups.com


2012/2/7 Tiago Garcia <tiag...@gmail.com>

Como estou tentando usar o padrão pra facilitar pra mim claro, vai ser muito util quando eu precisar rescontruir o objeto, no caso Reserva.new, vai receber os params, e espero que ele faça essa construção.

Também espero. :)

 
na consulta, esta pronto entao, pelo que vimos.


Acho que sim
 
Tem como passar novamente, eles estao guardados no params, entao posso usar-los novamente.


Sim.
 
estou usando essa função pra verificar se a data é valida.

Date.valid_civil?, retorna true na data que passo.

Essa pra saber se retornou mais q uma tarifa.
@tarifa.to_a.size

pra saber se é fim de semana, vou usar assim dentro de um case:
.strftime('%A')

vao ser n funçoes, até conseguir calcular essa tarifa.


=)
Reply all
Reply to author
Forward
0 new messages