2013-09-25 7 views
48

jestem coraz UTC datownik z bazy danych, która jest mi ustawienie w JodaTime DateTime przykładW czasie Joda Jak przekonwertować strefę czasową bez zmiany czasu

DateTime dt = new DateTime(timestamp.getTime()); 

Przechowuje czas doskonale powiedzieć 10:00 AM ale z lokalnej strefy czasowej . Np. Jestem w strefie czasowej IST, która wynosi +5: 30 od UTC

Próbowałem wiele rzeczy do zmiany strefy czasowej, ale z każdą rzeczą zmienia się czas z 10:00 AM na coś innego przy użyciu +5: 30 różnica

Czy istnieje jakiś sposób, za pomocą którego można zmienić TimeZone bez wpływu na aktualny czas

EDIT: Jeśli mój aktualny czas:

2013-09-25 11:27:34 AM  UTC 

wyniku jest rezultatem kiedy używam tego new DateTime(timestamp.getTime());

2013-09-25 11:27:34 AM Asia/Kolkata 

I po to wynik podczas korzystania z tego new DateTime(timestamp.getTime(), DateTimeZone.UTC);

2013-09-25 05:57:34 AM UTC 
+0

Witam. Czy możesz mi powiedzieć, która metoda działa dla ciebie? –

+0

@ShajeelAfzal Używam głównie 'LocalDateTime', gdy nie chcę bawić się strefami czasowymi – Abhi

Odpowiedz

35

Można użyć klasy LocalDateTime

LocalDateTime dt = new LocalDateTime(t.getTime()); 

i konwertować LocalDateTime do DateTime

DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC); 

Joda DateTime traktuje każdy czas w Millis jak "ms od 1970y w aktualnej strefy czasu" . Tak więc, gdy utworzysz instancję DateTime, zostanie ona utworzona z bieżącą strefą czasową.

+0

Proszę sprawdzić edycję, wspomniałem tam wyjście tam – Abhi

+0

To działało przy użyciu' LocalDateTime' ale dlaczego DateTime zachowuje się w ten sposób? Czy jest na to jakieś rozwiązanie? – Abhi

+0

@Abhi Co to jest 'timestamp'? 'java.util.Date' lub' java.sql.Timestamp'? – Ilya

44

Możesz użyć metody withZoneRetainFields() z DateTime, aby zmienić strefę czasową bez zmiany cyfr w dacie.

+2

Należy uważnie korzystać z tej sytuacji, ponieważ może ona wygenerować wyjątek podczas przesunięcia czasowego, jeśli używa się go w środowisku skonfigurowanym do oszczędności czasu. Jeśli masz datę w tekście, możesz preferować takie rozwiązanie, jak http://stackoverflow.com/questions/5451152/how-to-handle-jodatime-illegal-instant-due-to-time-zone-offset-transition? answerertab = głosów # tab-top – rattek

2

Oto jak to zrobić:

private DateTime convertLocalToUTC(DateTime eventDateTime) { 

     // get your local timezone 
     DateTimeZone localTZ = DateTimeZone.getDefault(); 

     // convert the input local datetime to utc 
     long eventMillsInUTCTimeZone = localTZ.convertLocalToUTC(eventDateTime.getMillis(), false); 

     DateTime evenDateTimeInUTCTimeZone = new DateTime(eventMillsInUTCTimeZone); 

     return evenDateTimeInUTCTimeZone.toDate(); 
} 
8

Jeśli znacznik czasu jest: 2015-01-01T00: 00: 00.000-0500 (jest to czas lokalny [dla mnie])

Try to:

DateTime localDt = new DateTime(timestamp.getTime()) 
    .withZoneRetainFields(DateTimeZone.UTC) 
    .withZone(DateTimeZone.getDefault()); 

2014-12-31T19: 00: 00.000-05: 00

Breaki ng go: Daje to DateTime odpowiadającą swoim datownik, określając, że jest w UTC:

new DateTime(timestamp.getTime()) 
    .withZoneRetainFields(DateTimeZone.UTC) 

2015-01-01T00: 00: 00.000Z

Daje to DateTime ale z czas przeliczony na lokalny czas:

new DateTime(timestamp.getTime()) 
    .withZoneRetainFields(DateTimeZone.UTC) 
    .withZone(DateTimeZone.getDefault()); 

2014-12-31 T19: 00: 00.000-05: 00

0

Mam również inne podejście, które było dla mnie bardzo pomocne. Chciałem, aby mój wątek przepływu pracy został tymczasowo zmieniony na konkretną strefę czasową (oszczędzając czas), a po zakończeniu mojego kodu ustawiam ponownie strefę czasową. Okazuje się, że podczas korzystania z biblioteki Joda, robi:

TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone)); 
TimeZone.setDefault(timeZone); 

To nie wystarczy. Musimy również zmienić strefę czasową w DateTimeZone następująco:

@Before 
public void setUp() throws Exception { 
    timeZone = TimeZone.getDefault(); 
    dateTimeZone = DateTimeZone.getDefault(); 
} 

@After 
public void tearDown() throws Exception { 
    TimeZone.setDefault(timeZone); 
    DateTimeZone.setDefault(dateTimeZone); 
} 

@Test 
public void myTest() throws Exception { 
    TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone)); 
    DateTimeZone.setDefault(DateTimeZone.forID(myTempTimeZone)); 
    //TODO 
    // my code with an specific timezone conserving time 
} 

Nadzieja pomaga kogoś innego, jako dobrze.