2014-04-04 1 views
2

나는 다음과 같은 값으로 입력 한 날짜의 데이터베이스 열이PostgreSQL을 날짜 타입과 자바 SimpleDateFormat의

2014-05-01 

내가 다음 최대 절전 모드 매핑이 : 나는이 날짜를 참조하면

@Temporal(TemporalType.DATE) 
@Column(name = "end_date", nullable = false, length = 13) 
public Date getEndDate() { 
    return this.endDate; 
} 

public void setEndDate(Date endDate) { 
    this.endDate = endDate; 
} 

을 JSF 페이지는 다음과 같습니다.

<h:outputText value="#{someBean.endDate}"> 
    <f:convertDateTime pattern="d MMM yyyy" /> 
</h:outputText> 

으로 읽습니다. convertDateTime을 그것은 보여줍니다 :
'30 Apr 2014' 

그래서 F를 제거

'5/1/2014' 

그래서 나는 다음 F를 변경 : convertDateTime을에 :

<h:outputText value="#{someBean.endDate}"> 
    <f:convertDateTime pattern="HH:mm d MMM yyyy" /> 
</h:outputText> 

그리고 읽

'23:00 30 Apr 2014' 

제 추측으로는 내 컴퓨터가 BST (British Su mmer 시간) 데이터베이스의 날짜가 어떻게 든 GMT (또는 줄루 시간)로 설정되어 -1 시간으로 인해 날짜가 전날로 되돌아갑니다.

이 문제를 막을 수있는 방법이 있습니까? 저는 단지 시간 구성 요소가없는 날짜로 취급하고 싶습니다!

+0

가능한 중복 [f : convertDateTime 잘못된 날짜 표시] (http://stackoverflow.com/questions/2689245/fconvertdatetime-displays-wrong-date) –

답변

2

당신도 시간대를 지정해야합니다 (또한 안전을 위해 영어 로케일) : 이에

<h:outputText value="#{someBean.endDate}"> 
    <f:convertDateTime pattern="d MMM yyyy" timeZone="GMT" locale="en" /> 
</h:outputText> 

I는 입력이 처음에 상대적으로 저장된 문자 그대로의 날짜입니다 (UTC-시간대에 있다고 가정 UTC), 출력 형식에 동일한 오프셋을 사용하더라도 날짜는 변경되지 않습니다 (그리고 "5/1/2014"의 중 간 출력은 동일한 오프셋 효과로 변경된 기본 US 형식 일뿐입니다).

다른 시간대 변환을 사용하여 날짜를 저장 한 경우 timeZone 속성 (예 : "Europe/London")을 조정해야합니다.

업데이트 : 나는 당신을 도울이 SO-question을 발견했습니다.

+0

위대한 예. 하지만 날짜가 '01/05/2014 '로 데이터베이스에 저장되어 있다면 입력 한 시간대를 어떻게 알 수 있습니까? – DaveB

+1

@DaveB'java.util.Date '형의 객체 자체는, 그 내부 상태의 타임 존을 가지고 있지 않습니다. 그러나 응용 프로그램 계층에서 jdbc 계층을 통해 데이터베이스로 전송할 경우 시간대 변환이 사용되므로 UNIX 에포크에 비해 저장된 밀리 초를 변경할 수 있습니다. –

+0

감사합니다. 그렇습니다. 연결된 질문도 나를 도와주었습니다. – DaveB