2016-12-27 4 views
4

나는 Gson을 사용하여 나의 pojos를 직렬화/역 직렬화하고 Gson에게 날짜 속성을 유닉스 타임 스탬프로 구문 분석/출력하도록 명확한 방법을 찾고있다. 여기 내 시도입니다 :유닉스 타임 스탬프를 파싱/출력하기위한 Gson dateformat

Gson gson = new GsonBuilder().setDateFormat("U").create(); 

PHP에서 오는 "U"는 구문 분석하는 데 사용되는 DATEFORMAT/유닉스 타임 스탬프로 출력 날짜입니다, 내 시도 코드를 실행할 때,이 RuntimeException을 얻고있다 :

알 수없는 패턴 문자 'U는'내가 GSON는 문자 "U"를 정의하지 않습니다 후드하여 SimpleDateFormat을 사용하는 가정입니다

합니다.

DateTypeAdapter을 쓸 수 있으며 GsonBuilder에 등록 할 수 있지만이를 달성하기위한 더 깨끗한 방법을 찾고 있습니다. 단순히 DateFormat을 변경하는 것이 좋습니다.

답변

7

사용자 정의 DateTypeAdapter을 만드는 것이 좋습니다.

MyDateTypeAdapter

public class MyDateTypeAdapter extends TypeAdapter<Date> { 
    @Override 
    public void write(JsonWriter out, Date value) throws IOException { 
     if (value == null) 
      out.nullValue(); 
     else 
      out.value(value.getTime()/1000); 
    } 

    @Override 
    public Date read(JsonReader in) throws IOException { 
     if (in != null) 
      return new Date(in.nextLong() * 1000); 
     else 
      return null; 
    } 
} 

등록하는 것을 잊지 마십시오

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,new MyDateTypeAdapter()).create(); 
+1

안녕하세요, 귀하의 답변은 https://github.com/google/gson/issues/987에서 귀하의 질문을 해결합니다. ypu는 실제 Gson 방식으로 구현 된 자체 솔루션을 가지고 있으므로 (해결 방법이 아니며, 의도적으로 설계된 것입니다) :) 문제를 닫으시겠습니까? 감사! –

+0

@LyubomyrShaydariv 나를 상기시키기위한 고맙습니다. 귀하의 요청이 이행되었습니다. (그리고 Gson이 설계 한 방식이다.) – AnixPasBesoin

+1

아, 그리고 또 하나 주목해라.'JsonReader.toString'는'JsonReader'와 같이 사람이 읽을 수있는 현재'JsonReader' 상태를 1 행 1 열 경로 $와 같이 반환합니다. 아마 typo가 있고,'in.nextString()'은 코드에서 정말로 필요한 것을 수행합니다. 아니면 더 짧게 :'new Date (in.nextLong()/1000)'. –

0

타임 스탬프는 단지 long입니다. 따라서 POJO에서 사용할 수 있습니다. 또는 필드가 누락되면 null을 얻으려면 Long을 사용하십시오.

class myPOJO { 
    Long myDate; 
} 
+0

날짜로 내 날짜 속성을 유지하는 다른 방법은 없을까? 이것은 제가 다루고있는 문제에 대한 해킹 된 해결책 인 것 같습니다. – AnixPasBesoin

관련 문제