자바

2013-12-16 4 views
5

인쇄 된 결과가 아닌 그러나 나는 다음과 같은 코드자바

@Test 
public void playingWithJodaTime() { 

    LocalDateTime localDateTime = new LocalDateTime(); 
    System.out.println("server localDateTime : " 
      + localDateTime.toDateTime(DateTimeZone.getDefault()).toDate()); 
    System.out.println("user's localDateTime : " 
      + localDateTime.toDateTime(DateTimeZone.forID("Asia/Jakarta")) 
        .toDate()); 
} 

인쇄 결과

server localDateTime : Tue Dec 17 00:04:29 SGT 2013 
user's localDateTime : Tue Dec 17 01:04:29 SGT 2013 

와 사용자의 하나에 서버의 날짜와 시간을 변환하기 위해 노력했습니다에 DateTimeZone를 사용하는 방법 사용자가 (UTC+07:00) Bangkok, Hanoi, Jakarta 인 동안 서버 시간대가 (UTC+08:00) Kuala Lumpur, Singapore 이후로 예상했던 것과 같습니다.

여기서 내가 뭘 잘못 했니?

답변

4

DateTime을 (를) 왜 Date (으)로 변환하고 있습니까?
java.util.Date은 기본 JVM의 시간대를 사용합니다.
따라서이 변환에서 시간대를 놓치 셨습니다. 당신이 뭔가 다른 joda 날짜 시간을 변환 할 경우

LocalDateTime localDateTime = new LocalDateTime(); 
System.out.println("server localDateTime : " 
     + localDateTime.toDateTime(DateTimeZone.getDefault())); 
System.out.println("user's localDateTime : " 
     + localDateTime.toDateTime(DateTimeZone.forID("Asia/Jakarta"))); 

, 다음 Calendar

LocalDateTime localDateTime = new LocalDateTime(); 
    System.out.println("server localDateTime : " 
     + localDateTime.toDateTime(DateTimeZone.getDefault()).toGregorianCalendar()); 
    System.out.println("user's localDateTime : " 
     + localDateTime.toDateTime(DateTimeZone.forID("Asia/Jakarta")).toGregorianCalendar()); 
1

LocalDateTime로 변환 시간없이 날짜 을 나타냅니다

이 예는 예상대로 작동 존.

toDateTime(DateTimeZone)를 호출하여 원래 LocalDateTime과 같은 날짜와 시간을 가지고 있지만 제공된 시간대와 연관된 DateTime를 얻기 위해 제공된 시간대로 LocalDateTime을 풍부. toDateTime을 호출 할 때 원래 로컬 날짜 시간에 연결된 표준 시간대가 없으므로 변환하지 않습니다. 서버에

:

  1. 서버 지역 날짜는 Tue Dec 17 00:04:29 2013입니다.
  2. UTC+08:00 시간대를 연결합니다.
  3. toDate().toString()으로 설정하면 +08:00 (또는 SGT) 인 Tue Dec 17 00:04:29 SGT 2013의 표현으로 변환됩니다. 연결된 시간대가 SGT이기 때문에 변환은 ID입니다. 사용자에

:

  1. 사용자는 현지 날짜를 Tue Dec 17 00:04:29 2013
  2. 당신은 UTC+07:00 시간대를 연결할 수 있습니다.
  3. toDate().toString()을 사용하면 기본 시간대 +08:00 (또는 SGT)의 표현으로 변환되므로 시간은 Tue Dec 17 01:04:29 SGT 2013입니다. 싱가포르와 자카르타 사이에는 +1 시간의 시간차가 있기 때문에 자카르타에서 자정에있을 때는 싱가포르에서 오전 1시입니다.
2

오류는 toDate()의 사용입니다. 왜? toDate()를 호출하면 LocalDateTime이 시간대와 무관 한 java.util.Date로 변환됩니다.그런 다음 기본 시간대를 사용하는 j.u.Date의 toString() - 메서드를 암시 적으로 사용하므로 두 경우 모두 동일한 표현을 얻습니다.

해결책은 단지 toDate() 호출을 생략하는 것입니다. JodaTime 객체는 toString() - ISO 표준을 따르는 구현이 더 우수하며 지정한대로 다른 시간대에 결과를 인쇄합니다.

+0

upps - 너무 느립니다. 어쨌든, 나는이 메소드를 toDate()로 제공하는 것이 JodaTime api의 디자인 약점이라고 생각한다. JSR 310은 이것을하지 않습니다. –

+0

Joda-Time의'toDate()'메소드는 java.util.Date만을 지원하는 오래된 클래스와 상호 작용하는 게이트웨이로 필요합니다. 이 방법은 기능이며 확실히 설계 실패가 아닙니다. Java 8의 JSR 310은 Date 클래스의 변환 메소드를 ['from'] (http://download.java.net/jdk8/docs/api/java/util)로 지정한다는 점을 제외하고는 실제로 똑같은 작업을 수행합니다. /Date.html#from-java.time.Instant-) 메소드를 호출해야합니다. –

+0

나는 todate()의 목적을 오래된 jdk 파일에 대한 게이트웨이/브릿지로 알고있다. 차이점은이 메소드가 DateTime에 직접 위치해야하는지 아니면 더 나은 위치에 있어야하는지입니다. 이 stackoverflow 문제는이 "기능"의 쉬운 오용을 나타냅니다. 우리는 사용자를 j.u.Date에서 더 멀리 이동시키고이를 사용하도록 권장해서는 안됩니다. –