2016-06-17 27 views
6

Tôi có một cột dấu thời gian trong bảng oracle. Trong khi lưu trữ thời gian tôi lưu trữ nó trong UTC trong cột này. Để lấy tem thời gian này, tôi đang sử dụng JdbcTemplate của Spring trong khi trả về đối tượng kiểu TimeStamp.Làm thế nào để lấy cột dấu thời gian oracle trong múi giờ dự kiến ​​trong Java?

Tôi muốn nhận chuỗi thời gian ngày theo định dạng "dd-MM-YYYY HH: mm: ss" trong múi giờ hiện tại. Để đạt được điều đó tôi đang cố gắng mã sau:

new LocalDateTime(<retrieved TimeStamp>, <current user DateTimeZone>).toString("yyyy-MM-dd HH:mm:ss") 

Cả LocalDateTime và DateTimeZone từ thư viện Joda.

Cách thức hoạt động này không hoạt động như mong đợi. Thay vì múi giờ của người dùng hiện tại trên mã cho tôi chuỗi thời gian ngày chỉ trong UTC.

Tôi đang thiếu gì?

+0

tên lớp đầy đủ cho LocalDateTime bạn đang instantiating đây là gì? Tôi không thể tìm thấy bất kỳ tài liệu nào giống như những gì bạn đang làm. –

+0

Tệ của tôi. Đã cập nhật trong mô tả. Đó là từ thư viện Joda. –

Trả lời

2

Thêm lịch utc khi lấy dấu thời gian từ cơ sở dữ liệu, vì vậy người lái xe jdbc có thể sử dụng múi giờ theo lịch thay vì hệ thống mặc định múi giờ.

//Assign utc calendar 
Calendar utc= Calendar.getInstance(); 
utc.setTimeZone(TimeZone.getTimeZone("UTC")); 
Timestamp timestamp = rs.getTimestamp("timestampcolumn", utc); 
//Convert to client date time 
DateTime dateTime = new DateTime(timestamp.getTime(), DateTimeZone.forID("Asia/Kolkata")); 
//Format 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
//Change to client wall clock time 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime) 

Ví dụ

String utcTime = "2016-06-17 14:22:02Z"; 
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ"); 
DateTime dateTime = parser.parseDateTime(utcTime).withZone(DateTimeZone.forID("Asia/Kolkata")); 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
System.out.println(dateTime); 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime); 
System.out.println(formattedlocalDateTime); 
+0

Phương pháp này có cho bạn ngày giờ theo múi giờ chính xác không? Tôi đã thử điều này và tôi vẫn gặp vấn đề. –

+0

Đã cập nhật câu trả lời với ví dụ. Bạn có thể nhập các giá trị của bạn và xem nó có phù hợp với bạn không, – Veeram

+0

Đối với cùng một mã tôi nhận được các giá trị sau trên máy của tôi: dấu thời gian: 2016-06-17 09: 33: 25.0, datetime: 2016-06-17T09: 33: 25.000 + 05: 30, localDateTime: 2016-06-17T09: 33: 25.000, formatter.print (localDateTime): 17-06-2016 09:33:25. Tôi đã sử dụng "Asia/Kolkata" làm múi giờ. –

4

Tôi cho rằng ứng dụng của bạn đang sử dụng java.util.Date không có thông tin múi giờ, việc sử dụng toString áp dụng múi giờ mặc định hiện tại của JVM khi tạo chuỗi.

Bạn có thể điều chỉnh ngay lập tức múi giờ bằng (Using Joda Library)

ZonedDateTime Tokyo = ZonedDateTime.ofInstant (instant,zoneIdTokyo) ; 

Hoặc thực hiện khu

DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo"); 

Bạn đang sử dụng LocalDateTime đó là lớp học bất biến đại diện cho một ngày địa phương và thời gian (không có thời gian zone)

EDIT - Bạn có thể thử điều này (Tôi đã không kiểm tra nó)

DateTime udate = new DateTime("2016-05-01T20:10:04", DateTimeZone.UTC); 
System.out.println(udate); 
DateTime zone = udate.plusMillis(10000) 
.withZone(DateTimeZone.forID("Asia/Kolkata")); 
System.out.println(zone); 
+0

Tôi sẽ rất biết ơn nếu bạn có thể cung cấp đoạn mã nhỏ mà thực sự biến đổi đối tượng Dấu thời gian thành chuỗi được định dạng. –

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