2017-09-22 2 views
1

RESTful 웹 서비스의 모든 타임 스탬프에 LocalDateTime을 사용하고 모든 타임 스탬프 초기화 및 변경이 서버에서 수행됩니다.
서비스 클라이언트가 일부 리소스를 생성하면 서버는 내부적으로 생성 타임 스탬프를이 리소스에 할당합니다.JSON 직렬화 중에 localdatetime에 서버 시간대를 추가하는 방법은 무엇입니까?

class Resource { 
    private String data; 
    private LocalDateTime creationTimestamp; 

    public Resource(String someData) { 
    this.data = someData; 
    this.creationTimestamp = LocalDateTime.now(); 
    } 
} 

서버는 다시 JSON 형식의 리소스를 반환 :

{ 
    "data" : "someData", 
    "creationTimestamp" : "2017-09-22T12:03:44.022" 
} 

클라이언트가 creationTimestamp는이 타임 스탬프가 생성되고 잘못 시간을 렌더링하고있는 서버 시간대를 모르는 렌더링 할 때.

유일한 해결 방법은 응용 프로그램의 모든 타임 스탬프를 ZonedDateTime으로 변경하고 JSON의 시간대와 함께 클라이언트에 다시 반환하는 것입니다. 그러나이 방법은 매우 비쌉니다.

이 문제를 해결할 수있는 다른 방법이 있습니까?

+1

'LocalDateTime'에는 시간대가 없습니다. 또한, 어떤 JSON 직렬화 라이브러리를 사용하고 있습니까? –

+0

@MarkRotteveel, 시간대가 없다는 것을 알고 있으므로 ZonedDateTime으로 마이그레이션 할 생각입니다. JSON 직렬화에 잭슨을 사용합니다. –

답변

2

모든 타임 스탬프를 서버에 java.time.Instant 유형의 개체로 저장하고 클라이언트에 인스턴트를 보내는 것이 어떨까요?

이 의미

class Resource { 
    private String data; 
    private Instant creationTimestamp; 

    public Resource(String someData) { 
    this.data = someData; 
    this.creationTimestamp = Instant.now(); 
    } 
} 

그런 다음 클라이언트의 시간대에 순간을 인쇄 할 수있는 클라이언트의 작업입니다.

이러한 접근 방식은 많은 양의 데이터를 보내지 않으며 서버의 슬림 솔루션입니다. 그리고 모든 클라이언트가 이해할 수있는 서버에 UTC-timestamp를 저장하는 개념을 모델링합니다. 인스턴트/순간의 클라이언트 측 형식의 경우 다음과 같이 입력하십시오.

DateTimeFormatter dtf = ...; // custom format (maybe localized) 
Instant serverInstant = ...; 
String formatted = 
    dtf.format(serverInstant.atZone(ZoneId.of("Europe/Berlin"))); 
// or ZoneId.systemDefault() 
+0

이 접근 방식은 더 편리합니다. 감사합니다. –

관련 문제