2010-04-24 32 views
14

Tôi quen thuộc với chênh lệch thời gian in ấn trong mili giây:Cách thành ngữ nhất để in chênh lệch thời gian trong Java?

long time = System.currentTimeMillis(); 
//do something that takes some time... 
long completedIn = System.currentTimeMillis() - time; 

Nhưng, là có một cách tốt đẹp in một thời gian hoàn thành trong một định dạng cụ thể (ví dụ: HH: MM: SS) hoặc sử dụng Apache Commons hoặc thậm chí các đối tượng Ngày/Giờ của API nền tảng đáng sợ? Nói cách khác, cách ngắn nhất, đơn giản nhất, không vô nghĩa nào để viết một định dạng thời gian bắt nguồn từ mili giây trong Java?

+3

Phải là 'System.currentTimeMillis() - thời gian;'. –

Trả lời

20

Apache Commons có lớp DurationFormatUtils để áp dụng định dạng được chỉ định cho một khoảng thời gian. Vì vậy, một cái gì đó như:

long time = System.currentTimeMillis(); 
//do something that takes some time... 
long completedIn = System.currentTimeMillis() - time; 

DurationFormatUtils.formatDuration(completedIn, "HH:mm:ss:SS"); 
+0

Bạn thậm chí có thể đặt nội tuyến đó vào: DurationFormatUtils.formatDuration (System.currentTimeMillis() - time, "HH: mm: ss: SS"); – Liggy

+5

Hoặc sử dụng gần như giống hệt nhau, được xây dựng trong DurationFormatUtils.formatDurationHMS (end-start); – JRL

+0

@JRL: 'DurationFormatUtils.formatDurationHMS (end-start);' sẽ đáp ứng ví dụ được đưa ra trong câu hỏi, nhưng tôi đã thêm mili giây trong giải pháp của mình. –

1

Nếu bạn thực sự muốn thấy sự khác biệt mili giây, tôi không nghĩ rằng có một cách ngắn hơn, đơn giản hơn.

Nếu bạn cần một cách mạnh mẽ hơn (nhưng chắc chắn không đơn giản hơn) để thu thập thống kê hiệu suất, có Perf4J.

1

Không phải với kiến ​​thức của tôi. Nhưng printf() có thể làm điều này một cách dễ dàng nếu bạn tính toán các giá trị cho H, M và S, và sử dụng một mẫu% 02 cho mỗi.

4

Một thư viện được thiết kế cho mục đích này là cách tiếp cận tốt hơn, nhưng SimpleDateFormat với quyền TimeZone có thể đủ trong thời gian chưa đầy một ngày. Thời gian dài hơn cần điều trị ngày đặc biệt.

import java.text.DateFormat; 
import java.util.Date; 
import java.text.SimpleDateFormat; 
import java.util.TimeZone; 

public class Elapsed { 

    private static final long MS_DAY = 24 * 60 * 60 * 1000; 
    private final DateFormat df = new SimpleDateFormat("HH : mm : ss : S"); 

    public Elapsed() { 
     df.setTimeZone(TimeZone.getTimeZone("GMT")); 
    } 

    private String format(long elapsed) { 
     long day = elapsed/MS_DAY; 
     StringBuilder sb = new StringBuilder(); 
     sb.append(day); 
     sb.append(" : "); 
     sb.append(df.format(new Date(elapsed))); 
     return sb.toString(); 
    } 

    public static void main(String[] args) { 
     Elapsed e = new Elapsed(); 
     for (long t = 0; t < 3 * MS_DAY; t += MS_DAY/2) { 
      System.out.println(e.format(t)); 
     } 
    } 
} 

điều khiển đầu ra:

 
0 : 00 : 00 : 00 : 0 
0 : 12 : 00 : 00 : 0 
1 : 00 : 00 : 00 : 0 
1 : 12 : 00 : 00 : 0 
2 : 00 : 00 : 00 : 0 
2 : 12 : 00 : 00 : 0 
0
long diff = System.currentTimeMillis() - startTime; 
int hours = (int)(diff/3600000); diff -= hours * 3600000; 
int mins = (int)(diff/60000); diff -= mins * 60000; 
int secs = (int)(diff/1000); diff -= secs * 1000; 
System.out.println(String.format("%d:%d:%d.%d", hours, mins, secs, diff)); 
+1

Định dạng đầu ra này bị hỏng. –

0

tl; dr

Duration.ofMillis(…) 
     .toString() 

ISO 8601

là những gì, đơn giản nhất, không có cách nào vô nghĩa ngắn nhất để WRI một định dạng thời gian bắt nguồn từ mili giây

Tiêu chuẩn ISO 8601 xác định định dạng văn bản cho giá trị ngày giờ. Các định dạng này thực sự ngắn, đơn giản và vô nghĩa. Chúng hầu như có thể đọc được trên nhiều nền văn hóa khác nhau, thực tế và rõ ràng.

Kéo dài thời gian không được nối với dòng thời gian, standard formatPnYnMnDTnHnMnS. Các P đánh dấu sự khởi đầu, và các T tách các năm-tháng-ngày từ giờ phút-giây. Vì vậy, một tiếng rưỡi là PT1H30M.

java.time.Duration

Các lớp java.time bao gồm một cặp của các tầng lớp đại diện cho nhịp thời gian. Lớp Duration là dành cho giờ-phút-giây, và Period là dành cho năm tháng-ngày.

Duration d = Duration.ofMillis(yourMillisecondsNumberGoesHere); 

Các lớp java.time sử dụng định dạng ISO 8601 theo mặc định để phân tích cú pháp và tạo chuỗi. Các lớp học DurationPeriod sử dụng định dạng chuẩn cụ thể này. Vì vậy, chỉ cần gọi toString.

String output = d.toString(); 

Bạn có thể đi theo hướng khác, phân tích các chuỗi chuẩn này.

Duration d = Duration.parse("PT1H30M"); 

Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Nơi lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

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