2013-04-12 15 views
6

Trong ứng dụng của tôi, tôi có tùy chọn tạm dừng thực thi trong một khoảng thời gian nhất định. Tôi muốn hiển thị thời gian khi thực thi sẽ tiếp tục, bao gồm cả giây và tôi muốn chuỗi thời gian được định dạng theo cài đặt lưu trữ. Đây là mã tôi đã đưa ra:SimpleDateFormat.getTimeInstance bỏ qua định dạng 24 giờ

long millis = getResumeTime(); 
String timeString; 
timeString = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM).format(millis); 

Điều này tạo ra một chuỗi định dạng có giây, nhưng trả về định dạng AM/PM mặc dù tôi đã đặt định dạng thời gian 24 giờ trong cài đặt. Nó thậm chí còn thú vị hơn vì thời gian trong khay hệ thống được định dạng chính xác bằng định dạng 24 giờ.

tôi đã cố gắng sử dụng DateFormat.getTimeFormat như thế này:

long millis = getResumeTime(); 
String timeString; 
java.text.DateFormat df = android.text.format.DateFormat.getTimeFormat(this); 
timeString = df.format(millis); 

Nhưng chuỗi kết quả không chứa giây, và tôi không thấy một cách để bao gồm chúng.

Tôi đang chạy mã này trên trình giả lập Android 4.2. Am i thiếu cái gì ở đây? SimpleDateFormat có biết thiết lập 12/24 giờ không? Nếu không, làm thế nào để có được một chuỗi đại diện của thời gian (bao gồm cả giờ, phút và giây) trong định dạng hệ thống?

+0

Trùng lặp? http://stackoverflow.com/questions/9235934/get-preferred-date-format-string-of-android-system –

+0

No. Họ thảo luận về định dạng ngày. Tôi quan tâm đến định dạng Thời gian. Thật không may họ không luôn luôn làm việc theo cùng một cách. –

+0

Nếu bạn thay thế getTimeFormat cho getDateFormat 'android.text.format.DateFormat.getTimeFormat (getApplicationContext()))'? –

Trả lời

2

Nó rất có thể phụ thuộc vào hệ thống của bạn đang ở vị trí nào. Nếu hệ thống của bạn ở Hoa Kỳ, hệ thống sẽ mặc định là 12h thay vì 24h. ví dụ:

long millis = new Date().getTime(); 
String uk = SimpleDateFormat 
       .getTimeInstance(SimpleDateFormat.MEDIUM, Locale.UK) 
       .format(millis); 
String us = SimpleDateFormat 
       .getTimeInstance(SimpleDateFormat.MEDIUM, Locale.US) 
       .format(millis); 
System.out.println("UK: " + uk); 
System.out.println("US: " + us); 

sẽ cung cấp cho bạn

UK: 16:19:49 
US: 4:19:49 PM 

Vì vậy, có lẽ bạn có thể lấy các miền địa phương hệ thống và xác định nó trong định dạng của bạn.

Tuy nhiên, nếu bạn luôn muốn ở định dạng 24h, thì tôi khuyên bạn nên chỉ định rõ ràng nó trong trình định dạng của bạn.

CẬP NHẬT: Vì bạn muốn lấy định dạng thời gian dựa trên đặc điểm kỹ thuật của thiết bị, bạn có thể sử dụng giá trị Time_12_24 của hệ thống và xác định định dạng của bạn từ giá trị kết quả.

+1

"Tôi đề nghị bạn chỉ định rõ ràng nó trong trình định dạng của bạn" - Đó chắc chắn là một lựa chọn, nhưng tôi đã hy vọng có một phương pháp đã có sẵn có thể tự động làm điều đó :) –

+0

Đề xuất đó chỉ khi bạn muốn hiển thị Định dạng 24H. Tất nhiên, bạn luôn có thể sử dụng miền địa phương mặc định của JVM và tự động xác định định dạng hiển thị. – dispake

+1

Tôi không muốn hiển thị định dạng 24 giờ nhưng tôi muốn hiển thị định dạng 24 giờ nếu người dùng đã chọn hộp kiểm thích hợp trong cài đặt của thiết bị. Trong đó bao gồm các trường hợp nếu người dùng có Locale.US. Vì vậy, hãy nói rằng tôi có hai trường hợp: (1) Locale.US và 24 giờ checkbox UNCHECKED, (2) Locale.US và 24 giờ checkbox CHECKED. Trong cả hai trường hợp, SimpleDateFormat.getTimeInstance trả về giờ trong định dạng AM/PM, bỏ qua cài đặt hệ thống 24 giờ. –

0

Có lẽ bạn nên tạo mẫu định dạng của riêng mình. Nếu tôi nhớ chính xác, mẫu bạn muốn sử dụng là "HH: mm: ss.SSS" để cung cấp cho bạn giờ, phút, giây và ba chữ số chính xác của các giây phân số.

Xem tài liệu tham chiếu API cho SimpleDateFormat.

1
String timestamp = (DateFormat.format("yyyy.MM.dd kk:mm:ss", new Date())).toString(); 

Thay vì hh, hãy sử dụng kk.

5

dễ dàng hơn giải pháp là:

String timeString = DateUtils.formatDateTime(getContext(), timeInMillis, 
      DateUtils.FORMAT_SHOW_TIME); 

này xử lý một cách chính xác 12/24 thiết lập giờ người dùng.

2

Dường như có lỗi trong Android 5 đến 6.0.1 trong đó DateFormat#getTimeInstance(int) trả về một DateFormat bỏ qua Sử dụng định dạng 24 giờ. Các câu trả lời khác đề cập đến một loạt các cách giải quyết cho lỗi này. Bạn có thể theo dõi sự cố trên https://code.google.com/p/android/issues/detail?id=181201.