2013-10-23 1 views
0

내 레일 앱에는 원시 UTC 시간으로 설정하여 표시하려는 특정 여행 경비가 있습니다.datetime_select가 utc에 표시되지 않음

내 설정이 추가되었습니다/application.rb

세트 (빈 datetime_select), A, (UTC와 같은 DB에 저장) 디스플레이를 저장 (<%이 될 것 같다
config.time_zone = 'UTC' 
config.active_record.default_timezone = :utc 

= obj.date.to_utc %>와 수정 (미리 채워진 datetime_select).

설정에 대한 저장 또는 표시가 없습니다. 설정에 대한 수정 사항을 추가했습니다. before_save 호출을 추가하여 '+ 0000 '시간 속성.하지만 datetime 수정 문제가 실행되고있어.

편집 페이지를 볼 때 datetime_select는 이전에 저장 한 datetime을 표시합니다. 그러나 6 시간 전에 표시됩니다. 오후 10시 대신 오후 4 시가 표시됩니다.

<%= activity_log_item.object.date.utc %> 
<%= activity_log_item.datetime_select :date, 
    ampm: true, 
    use_short_month: true, 
    minute_step: 15, order: [:month, :day, :year, :hour, :minute] %> 
</td> 

첫 번째 줄은 예상 시간 (오후 10시)를 인쇄한다, 나는 DB에서 같은 시간 확인했습니다

여기 내 양식의 datetime_select입니다. 그러나 datetime_select 양식은 오후 4시를 표시합니다.

예를 들어 Time.zone = 또는 .in_time_zone을 사용하여 명시 적으로 구문 분석하지 않으면 내 앱에서 모든 시간을 설정하고 저장하고 UTC로 표시하고 싶습니다.

레일 3.2.12를 사용하고 있습니다.

+0

또한 주목할 가치가 있습니다. 페이지를 새로 고침하면 datetime_select가 미리 채워진 시간이 utc에서 utc로 전환됩니다. 일관성이 없지만 자주. – alaup

답변

0

레일스가 설정 파일에 설정 한 시간대를 강제로 사용하려면 응용 프로그램에 Time.zone.now 또는 Time.now.in_time_zone을 사용해야합니다. date_select 개체를 UTC로 시간을 기본값으로 설정하려면 컨트롤러의 new 동작에서 새 레코드를 new_record.date = Time.zone.now으로 초기화하면됩니다. 기본적으로

배경

, 레일 데이터베이스에 저장하기 전에 UTC 모든 날짜 필드를 변환합니다. Rails가 레코드를 읽어 들일 때 UTC 타임 스탬프를 설정 파일에 지정된 영역으로 변환합니다. Time.now은 웹 서버가 사용하도록 구성된 시간대에서 Time 객체를 반환합니다. Time.zone.now은 시스템 시간을 설정 파일의 시간대로 변환합니다.

실시 예는 여기에 실시 예이다. 내 컴퓨터 (일명 서버)가 EST에 구성되어 있습니다. Pails를 사용하도록 Rails 응용 프로그램을 구성했습니다. 데이터베이스는 UTC로 모든 것을 저장합니다

1.9.3p286 > Time.now 
=> 2013-11-12 13:33:40 -0500 
1.9.3p286 > Time.now.zone 
=> "EST" 
1.9.3p286 > Time.now.in_time_zone 
=> Tue, 12 Nov 2013 10:33:40 PST -08:00 
1.9.3p286 > Time.now.in_time_zone.zone 
=> "PST" 
1.9.3p286 > Time.zone.now 
=> Tue, 12 Nov 2013 10:33:40 PST -08:00 
1.9.3p286 > Time.zone.now.zone 
=> "PST" 
1.9.3p286 > Time.parse("12:34:56") 
=> 2013-11-12 12:34:56 -0500 
1.9.3p286 > Time.parse("12:34:56").zone 
=> "EST" 
1.9.3p286 > Time.parse("12:34:56").in_time_zone 
=> Tue, 12 Nov 2013 09:34:56 PST -08:00 
1.9.3p286 > Time.parse("12:34:56").in_time_zone.zone 
=> "PST" 
1.9.3p286 > Time.zone.parse("12:34:56") 
=> Tue, 12 Nov 2013 12:34:56 PST -08:00 
1.9.3p286 > Time.zone.parse("12:34:56").zone 
=> "PST" 
1.9.3p286 > Time.parse("12:34:56 UTC") 
=> 2013-11-12 12:34:56 UTC 
1.9.3p286 > Time.parse("12:34:56 UTC").zone 
=> "UTC" 
1.9.3p286 > Time.parse("12:34:56 UTC").in_time_zone 
=> Tue, 12 Nov 2013 04:34:56 PST -08:00 
1.9.3p286 > Time.parse("12:34:56 UTC").in_time_zone.zone 
=> "PST" 
1.9.3p286 > Time.zone.parse("12:34:56 UTC") # Note that the time is parsed as UST and then converted to PST 
=> Tue, 12 Nov 2013 04:34:56 PST -08:00 
1.9.3p286 > t = TripTicket.first 
=> #<TripTicket ...> 
1.9.3p286 > t.appointment_time # Reading a datetime field from the database 
=> Thu, 21 May 2009 10:29:11 PDT -07:00 
1.9.3p286 > t.appointment_time.in_time_zone # No additional conversion because rails already converted it to PST 
=> Thu, 21 May 2009 10:29:11 PDT -07:00 
1.9.3p286 > t.appointment_time_before_type_cast # The raw value in the database, stored as UTC 
=> "2009-05-21 17:29:11.614345" 
1.9.3p286 > t.appointment_time.utc 
=> 2009-05-21 17:29:11 UTC 
1.9.3p286 > t.appointment_time = Time.parse("12:34:56") # Set the time in the server local timezone, i.e. EST 
=> 2013-11-12 12:34:56 -0500 
1.9.3p286 > t.appointment_time # Reading the time. Note it's converted to PST already 
=> Tue, 12 Nov 2013 09:34:56 PST -08:00 
1.9.3p286 > t.appointment_time.zone 
=> "PST" 
1.9.3p286 > t.appointment_time.utc 
=> 2013-11-12 17:34:56 UTC 
1.9.3p286 > t.save 
=> true 
1.9.3p286 > t.reload 
=> #<TripTicket ...> 
1.9.3p286 > t.appointment_time_before_type_cast 
=> "2013-11-12 17:34:56" 
+0

추신 : 당신 saltlakecity.craigslist.org 게시물을 통해 이것을 발견했습니다. –