2013-09-25 48 views
48

Tôi nhận được tính theo giờ UTC timestamp từ cơ sở dữ liệu mà là tôi đang thiết vào một JodaTime DateTime dụTrong thời gian Joda làm thế nào để chuyển đổi múi giờ mà không cần thời gian

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

Nó lưu trữ thời gian thay đổi một cách hoàn hảo nói 10:00 AM nhưng với múi giờ địa phương . Ví dụ, tôi đang ở múi giờ IST là +5: 30 từ UTC

Tôi đã thử rất nhiều thứ để thay đổi múi giờ nhưng với mọi thứ nó thay đổi thời gian từ 10:00 AM sang một thứ khác bằng cách sử dụng +5: 30 sự khác biệt

có cách nào mà tôi có thể thay đổi mà không ảnh hưởng TimeZone thời điểm hiện tại

EDIT: Nếu thời gian hiện tại của tôi là:

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

Sau đây là kết quả khi tôi sử dụngnày

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

Và sau đây là kết quả khi tôi sử dụng số new DateTime(timestamp.getTime(), DateTimeZone.UTC) này;

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

Xin chào. Bạn có thể cho tôi biết phương pháp nào phù hợp với bạn không? –

+0

@ShajeelAfzal Tôi chủ yếu sử dụng 'LocalDateTime' khi tôi không muốn chơi xung quanh với múi giờ – Abhi

Trả lời

35

Bạn có thể sử dụng lớp LocalDateTime

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

và chuyển đổi LocalDateTime để DateTime

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

Joda DateTime xử lý bất cứ lúc nào trong millis như "millis từ 1970y trong khu thời điểm hiện tại" . Vì vậy, khi bạn tạo DateTime bản sao, nó được tạo với múi giờ hiện tại.

+0

Vui lòng kiểm tra chỉnh sửa, tôi đã đề cập đầu ra có – Abhi

+0

Nó hoạt động bằng' LocalDateTime' nhưng tại sao DateTime hoạt động như thế này? Có giải pháp nào cho nó không? – Abhi

+0

@Abhi 'dấu thời gian' là gì? 'java.util.Date' hoặc' java.sql.Timestamp'? – Ilya

44

Bạn có thể sử dụng phương pháp withZoneRetainFields()DateTime để thay đổi múi giờ mà không thay đổi các chữ số trong ngày.

+2

Sử dụng tình huống này một cách cẩn thận bởi vì nó có thể ném một ngoại lệ khi thay đổi thời gian nếu bạn đang sử dụng nó trong môi trường cấu hình tiết kiệm ánh sáng ban ngày. Nếu bạn có ngày trong văn bản, bạn có thể thích một giải pháp như http://stackoverflow.com/questions/5451152/how-to-handle-jodatime-illegal-instant-due-to-time-zone-offset-transition này? answerertab = phiếu # tab-top – rattek

2

Đây là cách tôi làm điều đó:

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

Nếu timestamp của bạn là: 2015-01-01T00: 00: 00.000-0500 (đây là giờ địa phương [đối với tôi])

Thử này:

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

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

BREAK ng nó xuống: này mang đến cho bạn một DateTime tương ứng với dấu thời gian của bạn, chỉ rõ rằng nó là trong UTC:

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

2015-01-01T00: 00: 00.000Z

này mang đến cho bạn một DateTime nhưng với thời gian được chuyển đổi thành giờ địa phương của bạn:

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

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

0

Ngoài ra tôi có một cách tiếp cận khác rất hữu ích đối với tôi. Tôi muốn đổi luồng công việc tạm thời thành một múi giờ cụ thể (bảo tồn thời gian), và sau đó khi mã của tôi kết thúc, tôi đặt lại múi giờ ban đầu. Nó chỉ ra rằng khi bạn đang sử dụng thư viện joda, làm:

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

Không đủ. Chúng tôi cũng cần phải thay đổi TimeZone trong DateTimeZone như sau:

@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 
} 

Hy vọng nó giúp cho người khác là tốt.

Các vấn đề liên quan