2017-08-13 27 views
5

Tôi gặp sự cố trong thời gian chuyển đổi từ máy chủ và tôi muốn chuyển đổi thành 24 giờ. Tôi đang sử dụng đoạn mã sau:Chuyển đổi chuỗi trong 12 (PM/AM) Giờ AM PM Thời gian thành 24 giờ giờ android

String timeComeFromServer = "3:30 PM"; 

SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a"); 

SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm"); 
try { 
    ((TextView)findViewById(R.id.ahmad)).setText(date24Format.format(date12Format.parse(timeComeFromServer))); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

Có lỗi:

Method threw 'java.text.ParseException' exception.)

thông báo lỗi chi tiết là:

Unparseable date: "3:30 PM" (at offset 5)

Nhưng nếu tôi thay PM-p.m. nó hoạt động mà không cần bất kỳ vấn đề như sau:

timeComeFromServer = timeComeFromServer.replaceAll("PM", "p.m.").replaceAll("AM", "a.m."); 

Bất kỳ ai có thể cho tôi biết đó là cách chính xác không?

+0

Tôi đã tìm thấy lỗi nếu tôi sử dụng Samsung J7 không làm việc mã đầu tiên và nếu tôi muốn làm việc phải thiết lập dòng này timeComeFromServer = timeComeFromServer.replaceAll ("PM", "pm"). ReplaceAll ("AM", "sáng"); nhưng các thiết bị khác hoạt động mà không có bất kỳ replaye nào – ahmad

Trả lời

1

SimpleDateFormat sử dụng ngôn ngữ mặc định của hệ thống (bạn có thể kiểm tra bằng cách sử dụng lớp java.util.Locale, gọi số Locale.getDefault()). Miền địa phương này là thiết bị/môi trường cụ thể, do đó bạn không thể kiểm soát và có thể có các kết quả khác nhau trong mỗi thiết bị.

Và một số miền địa phương có thể có định dạng khác cho trường AM/PM. Ví dụ:

Date d = new Date(); 
System.out.println(new SimpleDateFormat("a", new Locale("es", "US")).format(d)); 
System.out.println(new SimpleDateFormat("a", Locale.ENGLISH).format(d)); 

Đầu ra là:

p.m.
PM

Để không phụ thuộc vào đó, bạn có thể sử dụng Locale.ENGLISH trong trình định dạng của bạn, vì vậy bạn sẽ không phụ thuộc vào cấu hình mặc định của hệ thống/thiết bị của:

String timeComeFromServer = "3:30 PM"; 
// use English Locale 
SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); 
SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm"); 
System.out.println(date24Format.format(date12Format.parse(timeComeFromServer))); 

Đầu ra là:

15:30

Trình định dạng thứ hai không cần một miền địa phương cụ thể vì nó không xử lý thông tin cụ thể về miền địa phương.


Java new Date/Time API

Các lớp cũ (Date, CalendarSimpleDateFormat) có lots of problemsdesign issues, và họ đang được thay thế bằng các API mới.

Một chi tiết là SimpleDateFormat luôn làm việc với Date đối tượng, trong đó có đầy đủ các dấu thời gian (số mili giây kể từ 1970-01-01T00:00Z), và cả hai lớp implicity sử dụng múi giờ mặc định hệ thống behind the scenes, có thể đánh lừa bạn và tạo ra bất ngờ và khó để gỡ lỗi kết quả. Nhưng trong trường hợp cụ thể này, bạn chỉ cần các trường thời gian (giờ và phút) và không cần phải làm việc với các giá trị dấu thời gian. API mới có các lớp cụ thể cho từng trường hợp, tốt hơn và ít bị lỗi hơn.

Trong Android, bạn có thể sử dụng ThreeTen Backport, một cổng sau tuyệt vời cho các lớp ngày/giờ mới của Java 8. Để làm cho nó hoạt động, bạn cũng sẽ cần ThreeTenABP (nhiều hơn về cách sử dụng nó here).

Bạn có thể sử dụng một org.threeten.bp.format.DateTimeFormatter và phân tích đầu vào tới một org.threeten.bp.LocalTime:

String timeComeFromServer = "3:30 PM"; 

DateTimeFormatter parser = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH); 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); 

LocalTime time = LocalTime.parse(timeComeFromServer, parser); 
System.out.println(time.format(formatter)); 

Đầu ra là:

15:30

Đối với trường hợp cụ thể này, bạn cũng có thể sử dụng time.toString() để có được kết quả tương tự . Bạn có thể tham khảo javadoc để biết thêm thông tin về API backport.

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