2013-11-25 5 views
0

현지 시간으로 이벤트를 표시해야하는 곳에서 이 아닌이 사용자의 시간대가 아닌 이벤트가 발생하는 시간대에 표시되는 앱이 있습니다. 시간대 오프셋을 포함하여 ISO-8601 형식으로 시간을 가져옵니다. 시간대는 일정하지 않습니다. 표시되는 각 이벤트는 다른 출발 시각과 도착 시각을 나타낼 수 있습니다.GWT에서 현지 시간 표시

예를 들어, "2014-02-05T09 : 00-08 : 00"이고 "9:00 am"으로 표시하고 싶습니다.

private static final DateTimeFormat ISO_TIME_FORMAT = 
    DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mmZZZ"); 
private static final DateTimeFormat TIME_OF_DAY_FORMAT = 
    DateTimeFormat.getFormat(PredefinedFormat.HOUR_MINUTE); 

public static String formatTimeOfDay(String iso8601Time) { 
    return TIME_OF_DAY_FORMAT.format(QPX_TIME_FORMAT.parse(iso8601Time)); 
} 

을하지만 미국 동부에있어 이후이, 내 경우에는, "오전 6시의"사용자의 시간대의 시간을 표시

내 첫째, 순진 코드는 다음처럼 보였다.

GWT 참조를 보면 ISO-8601 날짜를 기준으로 올바른 TimeZone을 보유해야하는 것처럼 보입니다. 그러나이를 수행하는 방법이 명확하지 않습니다. 시도했습니다.

public static String formatTimeOfDay(String isoTime) { 
    Date date = QPX_TIME_FORMAT.parse(isoTime); 
    String tzoneStr = qpxTime.substring(16); 
    TimeZone tzone = TimeZone.createTimeZone(tzoneStr); 
    return TIME_OF_DAY_FORMAT.format(date, tzone); 
} 

"JSON 구문 분석 오류 : SyntaxError : 예기치 않은 숫자 -05 : 00"예외가 발생했습니다. 입력 문자열에서 Date와 TimeZone을 모두 파싱 할 수 있어야하는데, 그 안에 모든 정보가 인코딩되어 있기 때문입니다.

이 시점에서 isoTime.substring (11, 16)을 통해 입력 시간에서 시간을 직접 추출하는 것이 가장 쉬운 방법 인 것 같습니다. 즉, 24 시간에서 오전/오후 형식으로 변환하는 사용자 지정 파서를 작성해야하지만, 가장 쉬운 방법 일 수 있습니다.

대체 제안 사항이 있습니까?

답변

0

GWT 2.5.1에서 TimeZone.createTimeZone은 TimeZoneInfo의 JSON 버전을 가져옵니다 (이 JSON 버전은 TimeZoneConstants.properties에서 찾을 수 있음). "-08 : 00"영역 오프셋에서 JSON 버전을 생성하려면 직접 구문 분석해야합니다. 그러나 심지어 적절한 시간대에 여전히 나를 위해 작동하지 않습니다 : 모든 시간 오프셋 (offset) 영역을 포함 할 경우

DateTimeFormat ISO_TIME_FORMAT = DateTimeFormat.getFormat ("yyyy-MM-dd'T'HH:mmZZZ"); 
DateTimeFormat TIME_OF_DAY_FORMAT = DateTimeFormat.getFormat (PredefinedFormat.HOUR_MINUTE); 
String qpxTime = "2014-02-05T09:00-08:00"; 
RootPanel.get().add (new Label ("dts: " + qpxTime)); 
Date dt = ISO_TIME_FORMAT.parse (qpxTime); 
RootPanel.get().add (new Label ("dt: " + dt.toString())); 
String tzs = qpxTime.substring (16); 
RootPanel.get().add (new Label ("tzs: " + tzs)); 
int tzh = Integer.parseInt (qpxTime.substring (16, qpxTime.indexOf (':', 16))); 
RootPanel.get().add (new Label ("tzh: " + tzh)); 
// cf. http://www.docjar.com/html/api/com/google/gwt/i18n/client/TimeZoneInfo.java.html 
// cf. http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/i18n/client/constants/TimeZoneConstants.properties 
TimeZone tz = TimeZone.createTimeZone ("{\"id\": \"fromOffset\", \"std_offset\": " + (tzh * 60) + ", \"transitions\": [], \"names\": \"\"}"); 
RootPanel.get().add (new Label ("tz: " + tz)); 
RootPanel.get().add (new Label ("format plain: " + TIME_OF_DAY_FORMAT.format (dt))); // 9:00 AM 
// cf. http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java 
RootPanel.get().add (new Label ("format tz: " + TIME_OF_DAY_FORMAT.format (dt, tz))); // 9:00 AM 
RootPanel.get().add (new Label ("tz offset: " + tz.getStandardOffset())); // 480 
RootPanel.get().add (new Label ("format custom: " + TIME_OF_DAY_FORMAT.format (new Date (dt.getTime() + 60L * 60L * 1000L * tzh)))); // 1:00 PM 

가 수동으로 시간에 적용 할 수 있습니다. 그러나 표준 영역 이름도 구문 분석하려는 경우 클라이언트에서 TimeZoneConstants.properties을 구문 분석하거나 시간 변환을 서버로 오프로드해야합니다.

관련 문제