2013-07-16 76 views
17

Trong dự án của tôi, tôi nhận được phản hồi API ở định dạng json. Tôi nhận được một chuỗi giá trị thời gian theo định dạng thời gian UTC như thế này Jul 16, 2013 12:08:59 AM.
Tôi cần thay đổi điều này thành Giờ địa phương. Đó là nơi chúng tôi sử dụng ứng dụng này cần hiển thị giờ địa phương. Làm thế nào để tôi làm điều này?Chuyển đổi UTC thành Giờ địa phương trên Android

Dưới đây là một số mã tôi đã cố gắng:

String aDate = getValue("dateTime", aEventJson); 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z"); 
simpleDateFormat.setTimeZone(TimeZone.getDefault()); 
String formattedDate = simpleDateFormat.format(aDate); 

Giả aDate chứa Jul 16, 2013 12:08:59 AM

+0

có vẻ phù hợp với tôi. Có chuyện gì vậy? – Blackbelt

+0

Tôi nhận được ngoại lệ 'java.text.ParseException: Ngày không thể chia sẻ:" ngày 16 tháng 7 năm 2013 4:23:37 AM "(tại offset 21)' – MadTech

+3

điểm đánh dấu AM/PM không phải là z.z giữ cho múi giờ – Blackbelt

Trả lời

37

Đây là nỗ lực của tôi:

String dateStr = "Jul 16, 2013 12:08:59 AM"; 
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH); 
df.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = df.parse(dateStr); 
df.setTimeZone(TimeZone.getDefault()); 
String formattedDate = df.format(date); 

Cũng cần chú ý những "a" cho sáng/chiều marker ...

+0

Tôi nhận ngoại lệ 'java.text.ParseException : Ngày không thể đọc được: "ngày 16 tháng 7 năm 2013 4:23:37 AM" (tại điểm 21) ' – MadTech

+0

Nhận xét này có dành cho câu trả lời này không? – devconsole

+0

Tôi đã thử cùng một mã này trước đó tôi nhận được ngoại lệ trong dòng này 'Date date = df.parse (dateStr);' – MadTech

1

tài đoạn mã sau.

TimeZone defaultTimeZone = TimeZone.getDefault(); 
String strDefaultTimeZone = defaultTimeZone.getDisplayName(false, TimeZone.SHORT); 

//Your Code 
String aDate = getValue("dateTime", aEventJson); 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z"); 
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(strDefaultTimeZone)); 
String formattedDate = simpleDateFormat.format(aDate); 

Điều này sẽ hiệu quả.

+0

Tôi nhận được ngoại lệ 'java.text.ParseException: Ngày không thể chia sẻ:" Jul 16, 2013 4:23:37 AM "(tại offset 21)' – MadTech

1
//your UTC time var 
long time = UTCtime; 

//convert it 
Time timeFormat = new Time(); 
timeFormat.set(time+TimeZone.getDefault().getOffset(time)); 

//use the value 
long localTime = timeFormat.toMillis(true); 
2

tôi nên muốn đóng góp câu trả lời hiện đại. Trong khi SimpleDateFormat là lớp chúng tôi có để phân tích cú pháp và định dạng ngày giờ trong năm 2013 (ngoài thời gian Joda), giờ đây đã lỗi thời và chúng tôi có nhiều điều tốt hơn trong java.time hoặc JSR-310, API thời gian và ngày Java hiện đại đã xuất hiện cùng với Java 8 vào năm 2014.

Nhưng hầu hết các thiết bị Android vẫn không chạy Java 8, tôi nghe bạn nói. May mắn là bạn vẫn có thể sử dụng ngày và API thời gian Java hiện đại trên chúng thông qua ThreeTenABP, cổng sau của JSR-310 tới Java Android 7. Chi tiết có trong this question: How to use ThreeTenABP in Android Project.

Bây giờ mã này là:

DateTimeFormatter formatter 
      = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH); 
    String aDate = "Jul 16, 2013 12:08:59 AM"; 
    String formattedDate = LocalDateTime.parse(aDate, formatter) 
      .atOffset(ZoneOffset.UTC) 
      .atZoneSameInstant(ZoneId.systemDefault()) 
      .format(formatter); 
    System.out.println(formattedDate); 

Kể từ khi máy tính của tôi đang chạy Châu Âu/múi giờ Copenhagen, mà trong tháng Bảy là 2 giờ trước UTC, đây in

Jul 16, 2013 02:08:59 AM 

điểm tiếp theo:

  • Vì bạn có AM trong chuỗi của mình, tôi cho rằng giờ của bạn là trong vòng AM, từ 1 đến 12. Để phân tích cú pháp và định dạng chính xác bạn cần chữ thường h trong chuỗi mẫu định dạng. Viết hoa H là dành cho giờ trong ngày từ 0 đến 23.
  • Ưu tiên đưa ra một địa điểm khám phá cho trình định dạng (cho dù là SimpleDateFormat hoặc DateTimeFormatter). Nếu không có miền địa phương nào được cung cấp, trình định dạng sẽ sử dụng ngôn ngữ mặc định của thiết bị. “Jul” và “AM” bằng tiếng Anh và mã của bạn có thể chạy độc đáo trên nhiều thiết bị cho đến một ngày, thiết bị chạy trên thiết bị có ngôn ngữ không phải tiếng Anh và sự cố và bạn khó tìm ra lý do.
  • Nếu có thể, hãy cung cấp cho múi giờ mong muốn một cách dễ hiểu, ví dụ như ZoneId.of("Asia/Kolkata"). Múi giờ mặc định của JVM có thể được thay đổi bởi các phần khác của chương trình của bạn hoặc các chương trình khác đang chạy trong cùng một JVM, vì vậy không đáng tin cậy.
Các vấn đề liên quan