2011-11-13 30 views
7

Tôi đang cố gắng để có được một giá trị gấp đôi với vài giây để chuyển đổi sang định dạng thời gian tùy chỉnh. Tôi đã thử định dạng SimpleDate nhưng không hoạt động ...Thời gian tính bằng giây để định dạng chuỗi tùy chỉnh

Tôi có một giá trị kép ở định dạng sau: 407.33386569554585 (đại diện 407 giây và 333 mili giây ...).

Tôi cần ở định dạng sau: HH/MM/SS.MS

Tôi làm như thế nào?

Cảm ơn trước!

+0

Làm thế nào để giá trị nhận được trong đó biến đôi? Và làm thế nào là giá trị tăng gấp đôi được xây dựng - Tôi không thể nhìn thấy bất kỳ giây nào nữa :) – saintedlama

+0

Đồng ý, điều gì làm tăng gấp đôi đó đại diện cho? – Lucas

+0

Bạn có thể nhận được một vài ý tưởng tại đây: http://stackoverflow.com/questions/266825/how-to-format-a-duration-in-java-eg-format-hmmss –

Trả lời

12

Nhân với 1.000 rồi truyền tới một số long và tạo một ngày với nó.

Date date = new Date((long)(dubTime*1000)); 

Từ đây, bạn có thể sử dụng SimpleDateFormat để tạo chuỗi bạn muốn.

String formattedDate = new SimpleDateFormat("HH/mm/ss.SSS").format(date); 
+2

Nó tiếp tục thêm 9 giờ 30 phút trên .... funnily đủ thats múi giờ của tôi +9: 30 ... – Diesal11

+0

Làm thế nào để loại bỏ nó? – Diesal11

+0

Có vẻ như bạn muốn đặt 'Locale' của' Date' hoặc thay đổi 'Locale' sau khi xây dựng. Không chắc. Về cơ bản, 'long' bạn đang chuyển sẽ được hiểu là mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970 GMT. Nếu giá trị 'double' cho thời gian bạn có không phải là số giây kể từ thời đại đó, bạn sẽ cần phải thực hiện các phép biến đổi bổ sung để thực hiện nó. –

2

Dưới đây là một số mã chúng tôi sử dụng mà bạn có thể dễ dàng điều chỉnh. Việc thực hiện dưới đây sẽ in một giá trị như 00days 00h00m00s00ms:

public final static long ONE_MILLISECOND = 1; 
public final static long MILLISECONDS_IN_A_SECOND = 1000; 

public final static long ONE_SECOND = 1000; 
public final static long SECONDS_IN_A_MINUTE = 60; 

public final static long ONE_MINUTE = ONE_SECOND * 60; 
public final static long MINUTES_IN_AN_HOUR = 60; 

public final static long ONE_HOUR = ONE_MINUTE * 60; 
public final static long HOURS_IN_A_DAY = 24; 
public final static long ONE_DAY = ONE_HOUR * 24; 
public final static long DAYS_IN_A_YEAR = 365; 

public String formatHMSM(Number n) { 


    String res = ""; 
    if (n != null) { 
     long duration = n.longValue(); 

     duration /= ONE_MILLISECOND; 
     int milliseconds = (int) (duration % MILLISECONDS_IN_A_SECOND); 
     duration /= ONE_SECOND; 
     int seconds = (int) (duration % SECONDS_IN_A_MINUTE); 
     duration /= SECONDS_IN_A_MINUTE; 
     int minutes = (int) (duration % MINUTES_IN_AN_HOUR); 
     duration /= MINUTES_IN_AN_HOUR; 
     int hours = (int) (duration % HOURS_IN_A_DAY); 
     duration /= HOURS_IN_A_DAY; 
     int days = (int) (duration % DAYS_IN_A_YEAR); 
     duration /= DAYS_IN_A_YEAR; 
     int years = (int) (duration); 
     if (days == 0) { 
      res = String.format("%02dh%02dm%02ds%03dms", hours, minutes, seconds, milliseconds); 
     } else if (years == 0) { 
      res = String.format("%ddays %02dh%02dm%02ds%03dms", days, hours, minutes, seconds, milliseconds); 
     } else { 
      res = String.format("%dyrs %ddays %02dh%02dm%02ds", years, days, hours, minutes, seconds); 
     } 
    } 
    return res; 

} 
1

Chỉ cần để thêm vào câu trả lời của Tim: để có được chuỗi thích hợp không phân biệt múi giờ của bạn, chỉ cần sử dụng SimpleDateFormat.setTimeZone():

DateFormat dateFormat = new SimpleDateFormat("HH/mm/ss.SSS"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
// ... 
double doubleTime=1000.0; 
Date date = new Date((long) (doubleTime*1000)); 
String formattedTime = dateFormat.format(date); 

Và hãy chắc chắn để tham khảo ý kiến DateFormat.setTimeZone javadoc để biết khi nào timeZone có thể bị ghi đè.

3

Và trong Java 8 phong cách (nếu bạn muốn tránh những ngày cảnh báo deprecation):

DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("HH/mm/ss.SSS").withZone(ZoneId.of("UTC")); 
Instant instant = Instant.ofEpochMilli((long)(dubTime*1000)); 
return formatter.format(instant); 
+0

Ngày không được chấp nhận (chưa). – assylias

+0

Vâng, báo cáo về cái chết của ngày là một cường điệu. :-) –

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