2012-02-16 3 views
1

내가 원하는 간단한 것은 데이터베이스에서 UTC로 DateTime을 저장하고 UTC에서 다시 검색하는 것입니다. 그러나 레일은 로컬 시간대에 DateTime을 저장하고 8 시간 차이를 추가한다고 가정하는 것 같습니다. (PST). 내 모델에 DateTime 필드가 있습니다.레일 Postgres 시간대 처리

PUT을 통해 레일에 보내기 : 2012-02-17T03 : 46 : 58Z

내가 요청을 보내는 경우 어떻게 든 어떤 이유 혼동 시간대, 내 모델의 특정 인스턴스에서이 필드를 업데이트 (PUT)

후속 GET을 통해 반환 : 2012-02-17T11 : 46 : 58Z

시차는 정확히 8 시간이며 PST (-08 : 00) 인 시간대로 설명 할 수 있습니다.

레일 3.1.3에서 Datamapper 1.2를 사용하고 있습니다.

내 응용 프로그램 구성 시간대를 UTC로 명시 적으로 설정했습니다.

또한 dm-zone-type을 사용하려고했습니다. 나에겐 아무 것도 변하지 않았어.

내 repo에서 git-bisect가 밝혀졌다. 원래 sqlite에서 데이터베이스를 postgres로 전환했을 때이 오작동이 발생했다. 이 커밋은 database.yml과 gemfile 만 변경했다. 다른 건 없어.

아이디어가 있으십니까?

+0

Postgres 데이터베이스를 살펴보고 datetime 필드의 원시 데이터베이스 값이 무엇인지 확인 했습니까? –

+0

나는 똑같은 문제 ('dm-zone-types'를 사용하고있다.)를 가지고있다. 나는 Datamapper 1.2 및 dm-zone-types 0.3을 사용하여 Sinatra에 있습니다. 시간은 (zoned_time.rb의 "덤프"메소드의 반환 값에 따라) UTC로 저장되는 것으로 보이지만, 검색 한 후 시간대가 잘못된 시간의 로컬 영역입니다. POST : 2012-02-16 11:25:52 +0100, "CET"데이터베이스의 값 : 2012-02-16 10:25:52 +0000, "UTC"GET : 2012-02-16 10:25:52 +0100, "CET" –

+0

데이터베이스의 원시 값은 "2012-02-17 03:46:58"입니다. 그것은 UTC 시간과 내가 받고 싶어하는 가치입니다. 데이터베이스에서 값을 가져 와서 클라이언트에게 전송하는 것 사이에 레일은 내가 꽤 이해할 수없는 몇 가지 속임수를하는 것처럼 보입니다. 귀하의 의견을 보내 주셔서 감사합니다! – kaihowl

답변

2

나 자신이 해키 솔루션을 발견 :

설정 'UTC'에 환경 변수 TZ의 서버 시간대. 이 구성 옵션을 유지하기 위해, 나는 설정/boot.rb에 환경 변수 설정을 넣어하기로 결정

ENV['TZ'] = "UTC" 

나는 여전히 더러운 느낌이 솔루션은 여전히 ​​나에게 겁을 준다. 그래서 더 나은/깨끗한 솔루션을 높이 평가됩니다!