Как изменить формат даты?

89 views
Skip to first unread message

Gennady

unread,
Oct 11, 2008, 9:50:30 AM10/11/08
to RubyOnRails to russian
Здравствуйте,
Не могу разобраться с форматом дат, похоже, что проблема где-то
глубоко в недрах ROR, а я там не силен :(

Loading development environment (Rails 2.2.0)
>> e = Event.new
=> #<Event id: nil, start_date: nil, end_date: nil, deadline: nil,
client_id: nil, user_id: nil, bugtype_id: nil, lock_version: 0,
comments: nil, created_at: nil, updated_at: nil>
>> e.start_date = "25/05/2008"
=> "25/05/2008"
>> e.start_date
=> nil

но если поменять местами месяц и день, то

>> e.start_date = "05/25/2008"
=> "05/25/2008"

В environment.rb

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
:default => '%d/%m/%Y',
:date_time12 => '%d/%m/%Y %I:%M%p',
:date_time24 => '%d/%m/%Y %H:%M',
:db => "%d-%m-%Y",
:number => "%d/%m/%Y",
:date => "%d/%m/%Y"
)

Т.е. ситуация такая - при создании экземпляра, формат даты находится в
m-d-y и никаким образом и настройками это не изменяется. Получается
дурацкая ситуация - отправляем в формате d-m-y, в базу запрос идет в m-
d-y и в придачу если день (по моей версии :) > 12, то в запросе вообще
дата ID NULL.

Как бы это побороть?

labria

unread,
Oct 11, 2008, 2:23:13 PM10/11/08
to RubyOnRails to russian
ну переписать модуль работы с mysql чтобы он по вашей прихоти менял
день с месяцем при записи, например.
А вообще -- почему просто не отдавать ему дату так как он ее хочет?

Gennady

unread,
Oct 11, 2008, 3:35:00 PM10/11/08
to RubyOnRails to russian
Проблема не в том, как отдается в базу -это как раз настраивается,
проблема в том, какой формат даты у нового экземпляра... Впрочем
решение уже найдено, если будет интерес, расскажу.
Непонятно только одно - неужели все используют формат m-d-y?

labria

unread,
Oct 11, 2008, 3:41:35 PM10/11/08
to RubyOnRails to russian
Ну расскажите =)
А формат... Я лично либо использую хелперы, которые сами в нужный формат
конвертятся, либо иниализирую какойнить Date::civil, либо уж формирую
дату как того хочет рельса, если приходится.

Gennady

unread,
Oct 11, 2008, 4:28:17 PM10/11/08
to RubyOnRails to russian
Вот здесь http://blog.nominet.org.uk/tech/2007/06/14/date-and-time-formating-issues-in-ruby-on-rails/
подробно описана и проблема и патч для ее решения.
В environment.db
ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
:default => '%d/%m/%Y',
:db => "%d-%m-%Y"
)
Для postresql в postgresql.conf добавить
datestyle = 'dmy'
для mysql не проверял.
После всех этих манипуляций можно нормально пользоваться text_field и
calendar_date_select для ввода даты в привычном формате

Максим Кулькин

unread,
Oct 11, 2008, 4:36:21 PM10/11/08
to ror...@googlegroups.com
О да! А потом у Вас другие приложения,
работающие с этой СУБД и/или БД,
сломаются, т.к. они ожидают данные в
старом формате.

On 12.10.2008, at 0:28, Gennady wrote:

> Вот здесь http://blog.nominet.org.uk/tech/2007/06/14/date-and-time-formating-issues-in-ruby-o

Gennady

unread,
Oct 11, 2008, 4:38:41 PM10/11/08
to RubyOnRails to russian
Другие приложения, в отличие от ROR, умеют правильно общаться с базами
и посылать вместе с датой формат, в котором она посылается :)

On 11 окт, 23:36, Максим Кулькин <maxim.kul...@gmail.com> wrote:
> О да! А потом у Вас другие приложения,  
> работающие с этой СУБД и/или БД,  
> сломаются, т.к. они ожидают данные в  
> старом формате.
>
> On 12.10.2008, at 0:28, Gennady wrote:
>
>
>
> > Вот здесьhttp://blog.nominet.org.uk/tech/2007/06/14/date-and-time-formating-is...

Alexey Kovyrin

unread,
Oct 11, 2008, 6:23:26 PM10/11/08
to ror...@googlegroups.com
Ой, а как можно передать формат вместе с датой?

2008/10/11 Gennady <gennady...@gmail.com>:

--
Alexey Kovyrin
http://kovyrin.info/

Gennady

unread,
Oct 12, 2008, 3:15:39 AM10/12/08
to RubyOnRails to russian
легко - to_date("25/05/2008", "DD/MM/YYYY")

On 12 окт, 01:23, "Alexey Kovyrin" <ale...@kovyrin.net> wrote:
> Ой, а как можно передать формат вместе с датой?
>
> 2008/10/11 Gennady <gennady.kude...@gmail.com>:

Vladimir Rybas

unread,
Oct 17, 2008, 6:04:38 AM10/17/08
to RubyOnRails to russian
Module ActiveSupport::CoreExtensions::Array::Conversions

>> "17 Oct 2008".to_date.to_formatted_s(:db)
=> "2008-10-17"

Инициализация своих форматов:
config/initializers/time_format.rb
Date::DATE_FORMATS[:for_yui_calendar] = "%m/%d/%Y"

>> "17 Oct 2008".to_date.to_formatted_s(:for_yui_calendar)
=> "10/17/2008"

Gennady

unread,
Oct 17, 2008, 10:07:47 AM10/17/08
to RubyOnRails to russian
Проблема не просто в преобразовании формата даты
Попробуйте
>> "17 Oct 2008".to_date.to_formatted_s(:for_yui_calendar)
=> "17/10/2008"
>> e = Event.new
=> #<Event id: nil, start_date: nil, deadline: nil, end_date: nil,
client_id: nil, user_id: nil, description: nil, bugtype_id: nil,
created_at: nil, updated_at: nil, lock_version: 0>
>> e.start_date = "25/05/2008"
=> "25/05/2008"
>> e.start_date
=> nil
>> e.start_date.to_date.to_formatted_s(:for_yui_calendar)
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.to_date
from (irb):5

Maxim Kulkin

unread,
Oct 17, 2008, 10:12:41 AM10/17/08
to ror...@googlegroups.com
Каждый решил сумничать.

17 октября 2008 г. 14:04 пользователь Vladimir Rybas
<Vladim...@gmail.com> написал:

Михаил Лапшин

unread,
Oct 17, 2008, 10:26:05 AM10/17/08
to ror...@googlegroups.com
2008/10/17 Gennady <gennady...@gmail.com>

Проблема не просто в преобразовании формата даты
Попробуйте
>> "17 Oct 2008".to_date.to_formatted_s(:for_yui_calendar)
=> "17/10/2008"
>> e = Event.new
=> #<Event id: nil, start_date: nil, deadline: nil, end_date: nil,
client_id: nil, user_id: nil, description: nil, bugtype_id: nil,
created_at: nil, updated_at: nil, lock_version: 0>
>> e.start_date = "25/05/2008"
=> "25/05/2008"
>> e.start_date
=> nil
>> e.start_date.to_date.to_formatted_s(:for_yui_calendar)
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.to_date
       from (irb):5

А аксессоры переопределить у Event-а не думали?
 

Gennady

unread,
Oct 17, 2008, 11:28:12 AM10/17/08
to RubyOnRails to russian
Наверное глупый вопрос - а как?

On 17 окт, 17:26, "Михаил Лапшин" <sotak...@sotakone.com> wrote:
> 2008/10/17 Gennady <gennady.kude...@gmail.com>

Vladimir Rybas

unread,
Oct 18, 2008, 3:29:00 AM10/18/08
to RubyOnRails to russian
On 17 окт, 21:12, "Maxim Kulkin" <maxim.kul...@gmail.com> wrote:
>> Каждый решил сумничать.

??? =)) Не сумничать вообще-то, а опытом поделиться. Про
CoreExtensions в этой ветке ни слова не было.

On 17 окт, 21:07, Gennady <gennady.kude...@gmail.com> wrote:
>> Проблема не просто в преобразовании формата даты
>> > e.start_date = "25/05/2008"
>> > => "25/05/2008"
>> > e.start_date
>> > => nil

Точно. Сразу не заметил. Nil потому что в поле c типом :date
впихиваются данные в неправильном форме. Запара с русским форматом.
Дату "25/05/2008" он воспринимает как 5й день 25го месяца, после чего
происходит разрыв мозга ))
Поменяй их местами и все заработает.
У меня день/месяц/год находятся в отдельных селектбоксах, а в
контроллере потом
record.date = (params[:year].to_s+'-'+params[:month].to_s
+'-'+params[:day]).to_date.to_formatted_s(:db)
и в базу все записывается хорошо.
Если дата приходит не из селектбоксов и точно в "русском" формате, то
надо переворачивать.

Максим Кулькин

unread,
Oct 18, 2008, 3:59:15 AM10/18/08
to ror...@googlegroups.com

On 18.10.2008, at 11:29, Vladimir Rybas wrote:

> On 17 окт, 21:12, "Maxim Kulkin" <maxim.kul...@gmail.com> wrote:
>>> Каждый решил сумничать.
>
> ??? =)) Не сумничать вообще-то, а опытом
> поделиться. Про
> CoreExtensions в этой ветке ни слова не было.

Как это не было ? Сам Геннадий (кто
начал обсуждение) и написал про него.

> On 17 окт, 21:07, Gennady <gennady.kude...@gmail.com> wrote:
>>> Проблема не просто в преобразовании
>>> формата даты
>>>> e.start_date = "25/05/2008"
>>>> => "25/05/2008"
>>>> e.start_date
>>>> => nil
>
> Точно. Сразу не заметил. Nil потому что
> в поле c типом :date
> впихиваются данные в неправильном
> форме. Запара с русским форматом.
> Дату "25/05/2008" он воспринимает как 5й
> день 25го месяца, после чего
> происходит разрыв мозга ))
> Поменяй их местами и все заработает.
> У меня день/месяц/год находятся в
> отдельных селектбоксах, а в
> контроллере потом
> record.date = (params[:year].to_s+'-'+params[:month].to_s
> +'-'+params[:day]).to_date.to_formatted_s(:db)
> и в базу все записывается хорошо.
> Если дата приходит не из селектбоксов
> и точно в "русском" формате, то
> надо переворачивать.

Переворачивать в контроллере - это не
айс. Собственно, Геннадий и ищет
способы, как бы это сделать легче, чем
хачить методы string_to_time/string_to_date в
ActiveRecord::ConnectionAdapters::Column. Хотя по мне -
отличное решение.

Gennady

unread,
Oct 18, 2008, 6:00:30 AM10/18/08
to RubyOnRails to russian
А я на нем и остановился, т.к. это единственный рабочий вариант
Reply all
Reply to author
Forward
0 new messages