2010-08-02 2 views
2

앱의 시간대를 변경하는 가장 좋은 방법은 무엇입니까? 내가 볼때는 다음과 같은 상황이 발생해야합니다grails/mysql timezone change

  1. 서버 TZ는 SYS 관리자에 의해 변경
  2. mysql을 다시 시작해야합니다.
  3. 데이터베이스의 모든 시간 기반 열에는 convert_tz 또는 이와 동등한 것을 사용하여 모든 값이 업데이트되어야합니다. 그래서 mysql 스크립트가 작성되거나 모든 클래스를위한 모든 행을로드하는 grails 스크립트가 있어야 모든 시간 필드를 업데이트 할 수 있습니다.

분명히 서버가 중단되고 오류가 발생하면 백업을해야합니다.

더 나은/더 쉬운 방법이 있나요?

답변

3

Java는 날짜를 사용할 때 시간대를 사용하지 않습니다. 모든 것을 UTC로 저장하고 날짜를 표시 할 때 시간대 만 사용합니다. Java 날짜/시간에 대한 설명은 다음 링크를 참조하십시오. 당신이 날짜를 사용하는 경우 http://www.odi.ch/prog/design/datetime.php

1

우리는 (빠른 데이터 가져 오기 위해) GORM을 사용하고 groovy.sql.Sql를 사용하여 사이의 시간 차이에 대한 문제가 있었다.

GORM은 부트 스트랩에서 설정 한 grails config timezone (UTC)을 사용했지만 groovy sql은 기본 시스템 시간대 (GMT)를 사용하고있었습니다.

$ JAVA_OPTS에 시간대를 설정하여 문제를 해결했지만 grails opts 또는 run-app 명령에 스위치를 추가 할 수 있습니다.

grails -Duser.timezone=UTC run-app

2

그래서 내가 기여할 것이라고 생각 ... 나는이 오래된 질문은 알고 있지만 나는 또한 ... 꽤 시대를 초월한 적어도, 나는 시간의 공정한 수가 최근에 발견 한 것 같아 내 해결책.

먼저 Grails 2.5.1과 PostgreSQL 9.4를 백엔드로 사용하고 있습니다.

둘째, Groovy/Grails의 날짜 필드는 PostgreSQL에 timestamp without time zone으로 저장됩니다. 그래서 위의 첫 번째 대답은 실제로는 완전히 정확하지 않은 것처럼 보입니다. 날짜는 UTC로 저장되지 않습니다. 이 관찰은 저를 생각하게 만들었습니다 ... "데이터베이스가 시간대가 무엇인지, 누가 누군지를 모르는 경우"의 라인을 따라 가면됩니까? 마음에 떠오른 첫 번째 대답은 "어쩌면 봄 일 것"이었습니다.

셋째, 내 문제는 내가 BootStrap.groovynew ThisClass().save()을 통해 데이터베이스에 부트 스트랩 한 날짜가 많다는 것입니다.그리고이 날짜는 날짜 + 시간이 아니기 때문에 모두 2005-11-03 00:00:00처럼 PostgreSQL 타임 스탬프 (시간대 없음)로 표시됩니다.

넷째, 내 GSP 중 하나를 편집하여 PST (내 서버가있는 곳)로 표시된 날짜 형식 문자열에 시간대를 포함 시켰을 때 실제로 페니 드롭을 만들었습니다. 문제의 필드의 g:formatDatetimeZone="Asia/Kolkata"을 포함 시켰을 때, 시간은 12h30만큼 앞당겨졌습니다. 그래서 꽤 명확하게 내 서버는 PST8PDT에서 실행 중이었고 PostgreSQL이 아니기 때문에 나는 물건을 바꿀 수있는 잠재적 인 장소로 봄으로 돌아왔다.

다섯째, grails-app/conf/spring/resources.groovy에 로케일 설정에 대한 몇 가지 의견을 읽은 후 나는에 따라,이 로케일 및 시간대 설정을 시도하기로 결정

// Place your Spring DSL code here 
beans = { 
    // from http://stackoverflow.com/questions/1569446/grails-how-to-change-the-current-locale 
    localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) { 
     defaultLocale = new Locale("en","IN") 
     java.util.Locale.setDefault(defaultLocale) 
     println "configure spring/resources.groovy defaultLocale $defaultLocale" 
     defaultTimeZone = TimeZone.getTimeZone("Asia/Kolkata") 
     java.util.TimeZone.setDefault(defaultTimeZone) 
     println "configure spring/resources.groovy defaultTimeZone $defaultTimeZone" 
    } 
} 

가 나는 또한 내 모든 날짜 필드에 대한 g:format timezone="Asia/Kolkata" format="dd MMM, yyyy a z"을 사용했다. 그리고 이것은 날짜가 "잘못된 시간대"에 처음 입력 되었더라도 정확한 시간대와 예상 시간 (즉, 입력 된 시간)에 PostgreSQL timestamp 필드의 모든 데이터를 해석하는 것으로 보입니다.

여섯 번째로 g:datePicker -이 "시간대에 민감한"항목에 ​​대한 게시물을 읽었지만 Spring에서 사용한 표준 시간대와 같이 날짜가 해석된다는 것을 알았습니다. 그래서 제 경우에는 이것이 꼭 필요한 것입니다. . 반대로, 누군가가 로케일에서 날짜를 입력하고 Spring이 서버의 시간대로 그들을 변환하려고한다면, 나는 약간의 추가 노력이 필요할 것입니다.

개인적으로 g:datePickertimeZone을 매개 변수로 받아 들인 것과 똑같이 사용하면 같은 방식으로 사용합니다. g:formatDate 않습니다.