Disyuntiva con fecha!

Saludos a la comunidad, tengo un problema con las fechas pues quiero
guardar mi fecha en el formato dd/mm/YYYY en mi aplicación estoy
utilizando postgres como controlador de mi BD, la pregunta es la
siguiente cuando reviso mi tabla en postgres la fecha la guarda con el
formato YYYY/mm/dd, ese problema es de la BD? Pues he intentado
configurar de las mil y una forma y nada!!! si el problema es de la BD
disculpen preguntare en un foro de postgres.

Gracias!!!

Yo de postgres no tengo ni idea, pero en MySQL, el formato YYYY/mm/dd es
el
que viene por defecto. Lo que yo te recomiendo es que introduzcas las
fechas
en ese formato para que la BBDD este contenta(igual esto es una
tonteria) y
luego al sacar el campo fecha lo formatees como quieras con las armas
que te
proporciona rails (que no se cual son, pero buscando un poco en la API o
en
google seguro encuentras).

Un saludo

El 8 de septiembre de 2008 17:18, Juan M. <
[email protected]> escribió:

Yo, al igual que Andrés, opino que te conviene más guardar las fechas
con el formato original de la BD y al momento de desplegarla en pantalla
le des el formato correspondiente, de hecho eso es lo que yo estoy
haciendo en mi sistema. Para lograr eso hice un simple helper que puse
en el archivo Application_helper.rb, dentro de la carpeta Helpers.

Este es el codigo de este helper:

def fecha(fecha_a_formatear)
fecha_a_formatear.strftime("%d/%m/%Y")
end

Despues, para mostrar la fecha en pantalla simplemente escribo algo asi
como:

<%= fecha( @tabla.fecha_a_mostrar ) %>

Espero que te sirva de algo

Andrés gutiérrez
escribió:> Yo de postgres no tengo ni idea, pero en MySQL, el formato YYYY/mm/dd

Si quieres guardar las fechas en el formato que tu quieres, siempre
puedes utilizar un campo de tipo string para guardarlas, lo que pasa
es que si algun dia tu proyecto cae en manos de otro desarrollador
puede ser que flipe bastante.

Puedes utilizar esto …

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
  :fecha => '%m/%d/%Y'
)

Y para hacer la conversión de la fecha, entonces haces:

@post.created_at.to_s(:fecha)

2008/9/8 Juan R. [email protected]:

El día 8 de septiembre de 2008 12:18, Juan M.
[email protected]
escribió:> Saludos a la comunidad, tengo un problema con las fechas pues quiero

guardar mi fecha en el formato dd/mm/YYYY en mi aplicación estoy
utilizando postgres como controlador de mi BD, la pregunta es la
siguiente cuando reviso mi tabla en postgres la fecha la guarda con el
formato YYYY/mm/dd, ese problema es de la BD? Pues he intentado
configurar de las mil y una forma y nada!!! si el problema es de la BD
disculpen preguntare en un foro de postgres.

Postgres no las guarda ni en formato año mes día, ni en formato
díames año, sino en la forma que a él le parece.
Modificando los seteos de la sesión una vez conectado a postgres con
el cliente que sea, con “SET DATESTYLE” podés ver las fechas en el
formato que necesites.

Silvio

2008/9/8 Juan R. [email protected]

end

Despues, para mostrar la fecha en pantalla simplemente escribo algo asi
como:

<%= fecha( @tabla.fecha_a_mostrar ) %>

Existe una forma específica para formatos de fecha en Rails, que
consiste en
agregar los nuestros propios a la constante
ActiveSupport::CoreExtensions::date::Conversions::DATE_FORMATS

en environment.rb

ActiveSupport::CoreExtensions::date::Conversions::DATE_FORMATS.merge!(:mi_formato
=> ‘%d/%m/%Y’)

Y ahora

@post.created_at.to_s(:mi_formato)

El día 8 de septiembre de 2008 12:59, Francesc E.
[email protected]
escribió:> id | title | created_at | updated_at

----±------±---------------------------±---------------------------
1 | Yay | 2008-09-08 15:57:05.24639 | 2008-09-08 15:57:05.24639

Lo que estaba tratando de decir es que no importa la forma en la que
se almacena, sino que independientemente de lo que haga postgres,
siempre el cliente puede determinar en qué forma se ven las fechas …
probá lo siguiente …

set datestyle = sql,DMY; select current_timestamp;
SET
now

08/09/2008 14:24:33.899 ART
(1 row)

set datestyle = iso; select current_timestamp;
SET
now

2008-09-08 14:24:40.289-03
(1 row)

Silvio

Yo opino que lo guarde la bd como le plasca, basta con poner
strftime("%d/%m/%Y") y ya estaspues si pones
algo = ObjetoAR.new
algo.created_at = Date.today
algo.save

luego algo.created_at.strftime(%d/%m/%Y") y ya lo tienes como quieres
hechale una ojeada al strtime tanto para date como para Time puedes
formatearlo de varias formas como lo necesites

El 8 de septiembre de 2008 10:59, Francesc E. <
[email protected]> escribió:

2008/9/8 Silvio Q. [email protected]:

Postgres no las guarda ni en formato año mes día, ni en formato día
mes año, sino en la forma que a él le parece.

Si seguimos las convenciones de Rails para crear la tabla … y
despues hacemos una consulta para ver los valores almacenados, a mi me
parece que no lo guarda en la forma que a él le parece. Vaya, que
podemos definir formatos, pero por defecto, con Rails tenemos un
formato bastante estandar.

id | title | created_at | updated_at
----±------±---------------------------±---------------------------
1 | Yay | 2008-09-08 15:57:05.24639 | 2008-09-08 15:57:05.24639

Hay 4 cosas implicadas:

  • Como muestras las fechas en las vistas

  • Como parseas las fechas que vienen de los forms

  • Como guarda AR una fecha (objeto Ruby de tipo Date) en un campo de
    tipo date en bbdd

  • Como AR construye una fecha (objeto Ruby de tipo Date) a partir de
    un campo de tipo date en bbdd

Salvo que estes con algo legacy no hay necesidad de tocar los dos
ultimos.

Buenos días a todos los compañeros…

 Primero disculpe que no había respondido si ya me funciona o no!!! 

ante todo miles de gracias por todas sus ayudas, mi tardanza en
responder es por la siguiente causa:
1.Estuve configurando el postgres como lo menciona el compañero
Francesc y Silvio lo que hice fue lo siguiente:
En el archivo postgresql.conf active la línea datestyle = ‘SQL, DMY’,
con ese formato pues por lo que leía guarda la fecha en el formato
dd/mm/yyyy, luego en la consoloa de postgres hice el siguiente comando:
SET DATESTYLE TO ‘SQL, DMY’; para ver si hizo el cambio el siguiente
comando: SHOW DATESTYLE; y me dio como resultado:
DateStyle


SQL, DMY

(1 fila)

Ok eso fue lo que hice con respecto a postgres.

2.Con respecto a mi aplicación pasa lo siguiente y con esto respondo un
poco las preguntas del compañero Xavier. Para agarra la fecha estoy
utilizando el plugin del calendar_date_select de google, con el formato
CalendarDateSelect.format = :italian pues ese es el que cumple mi
necesidad de que el formato sea dd/mm/yyyy ya que también el usuario
simplemente puede escribir la fecha con el formato mencionado.
3.Hice la prueba respectivamente y si me llega la fecha a mi controlador
con el formato indicado.
4.A la hora de guardar es donde tengo el problema pues toda fecha que
sea mayor o igual del 13 de noviembre no lo guarda lógicamente por el
formato que esta en la bbdd.

  Preguntas.

1.Si mi fecha esta llegando bien al controlador, tengo que hacer lo que
dice alguno de los compañeros, de darle otro formato para que mi bbddd
sea feliz?
2.El formato tendría que hacerlo tanto para guardarlo como para
mostrarlo?

Voy a realizar los tips que se mencionan y les diré que resultado
obtengo.

Si alguno de ustedes tiene otra solución se los agradezco de antemano.

Probando algunas cosas.

Por ejemplo haciendo la prueba en mi controlador hice lo siguiente:
@fecha= params[:alumno][:fnacimiento]
puts @fecha

efectivamente puedo ver la fecha, si hacemos el ejemplo con esta fecha
(31/12/1972) @fecha la guarda no hay problema en eso, ahora bien si lo
unico que quiero es estando en el controlador cambiar mi formato para
que se pueda guardar en la bbdd trate de hacer esto:

params[:alumno][:fnacimiento]=params[:alumno][:fnacimiento].strftime("%d/%m/%Y")
me da un error el cual es el siguiente: undefined method ‘strftime’ for
“31/12/1972”:String, probé hacer lo siguiente entonces
params[:alumno][:fnacimiento]=params[:alumno][:fnacimiento].to_date me
da un error el cual es el siguiente: invalid date

Todo esto para qué: si en consola hago lo siguiente:

a=Time.now

=> Tue Sep 09 12:01:09 -0430 2008

a.strftime("%d/%m/%Y")

=> “09/09/2008”

Siento que si puedo hacer lo mismo en el controlador soluciono mi
problema, pues lo que necesito es que cuando llegue la fecha al
controlador le cambio el formato con strftime("%Y/%m/%d") para que se
guarde en mi bbddd. El problema son lo errores que mencione
anteriormente que ni to_date ni
strftime("%Y/%m/%d") me estan funcionando en el controlador

Para atacar bien este problema has de distinguir muy bien cuando tienes

  • Una cadena Ruby arbitraria que podria tener pinta de fecha

  • Un objeto Ruby de tipo Date

Si tienes un objeto Date estas al cabo de la calle, eso es una fecha
bien formada por definicion.

Lo que tienes que hacer es pinchar en la generacion de vistas y
proceso de parametros. Porque en params TODO son cadenas. Una vez
asignes una fecha al modelo hacia la base de datos va solo. Y cuando
leas de base de datos lo que tienes es siempre un objeto Date. Solo
has de preocuparte de vistas y proceso de parametros.

Como tienes cadenas, al procesar un form debes intentar sacar un Date
de ahi y validar el resultado. A la hora de escribir la fecha en una
vista (o en un text field como valor por defecto) has de usar
#strftime de algun modo.

Todo eso es un poco manual y de ahi el generador que envie.

Te explico mi aproximacion actual a fechas y numeros por si te sirve.

La base de datos y los getters/setters de la fechas no los toco. Tengo
en un initializer este generador:

ActiveRecord::Base.class_eval do
def self.l10n_date(*syms)
syms.each do |s|
class_eval <<-EOS
def #{s}_as_string
#{s}.strftime("%d/%m/%Y") rescue ‘’
end

      def #{s}_as_string=(v)
        if date = MyAppUtils.parse_date(v)
          self.#{s} = date
        else
          self.errors.add(:#{s}, "fecha inválida")
        end
      end
    EOS
  end
end
...

end

De manera que un modelo dice:

class Project < AR::Base
l10n_date :deal_date
end

lo que genera metodos #deal_date_as_string y #deal_date_as_string=. En
las vistas solo uso campos *_as_string para fechas y numeros y todo lo
demas va automatico, mass-assignment, R/W a base de datos etc. Se
podrian autodescubrir las fechas pero suelo tener pocas y ya me vale
asi.

Si hace falta, pinchando en ese unico punto tienes localizacion segun
la cuenta, en lugar de hard-codear los formatos/parsers como estan en
el ejemplo de arriba los parametrizas de alguna manera.

Eso esta basado en algun railscast.

Y has probado con

@fecha=params[:alumno][:fnacimiento].to_date

2008/9/10 Juan M. [email protected]

Por FIN!!!

Bueno amigos les informo que ya pude solucionar mi problema, pero
antes de mencionar como lo hice le doy gracias todos los que me ayudaron
con mi duda, recapitulo un poco. En mi aplicación un usuario puede
escoger de un calendario X fecha en el formato dd/mm/yyy y esa fecha
deberia guardarse en la bbdd cosa que no pasaba, la fecha esta llegando
bien a mi controlador de la forma siguiente:
@fecha=params[:alumno][:fnacimiento], pero como dice el compañero Xavier
todo lo que esta con paramas son cadenas hice lo siguiente para poder
cambiar la cadena a una de tipo fecha, esto fue lo que hice:

@fecha=params[:alumno][:fnacimiento]
@dia=@fecha[0,2].to_i
@mes=@fecha[3,2].to_i
@ano=@fecha[6,4].to_i

nuevafecha = Date.new(@ano,@mes,@dia)
params[:alumno][:fnacimiento]=nuevafecha.strftime("%Y/%m/%d")

Y listo!!! funciona a la perfección y por la validación no me preocupo
pues el plugin del calendario me da la fecha exactamente como quiero,
ejemplo una fecha : 1/9/2008 no funcionaria para lo que hago, pero
modifique el formato de la fecha del plugin para que sea 01/09/2008 y de
esa manera si todo funciona!!! Gracias a todos.

PD: Si tengo un error por favor notificar. Gracias nuevamente.