2010-10-25 33 views
89

Tôi đang tạo một chương trình mà tôi cần có thời gian bằng mili giây. Theo thời gian, tôi có nghĩa là một con số không bao giờ bằng chính nó, và luôn luôn là 1000 con số lớn hơn nó là một giây trước. Tôi đã thử chuyển đổi DateTime.Now thành một số TimeSpan và nhận số TotalMilliseconds từ đó ... nhưng tôi đã nghe nó không hoàn toàn chính xác.Nhận thời gian bằng mili giây bằng cách sử dụng C#

Có cách nào dễ dàng hơn để thực hiện việc này không?

+0

Bạn có mong đợi hai cuộc gọi nào luôn hướng dẫn các giá trị gia tăng không? Nói chung, các cuộc gọi gần hơn khoảng thời gian tối thiểu mà độ phân giải hẹn giờ cho phép sẽ mang lại cùng một giá trị. Bạn sẽ cần phải thêm tiebreaker của riêng bạn trong các hình thức của một serializer giả chính xác. –

+14

"Một số không bao giờ bằng chính nó". Nghe có vẻ ... phức tạp. ;) – Mizipzor

+0

NaN sẽ phù hợp với yêu cầu đó. Mặc dù là "không phải là một số", nó là một loại số, và nó không bằng chính nó. – Yay295

Trả lời

66

Sử dụng lớp Stopwatch.

Cung cấp một tập hợp các phương thức và các thuộc tính mà bạn có thể sử dụng để đo chính xác thời gian đã trôi qua.

Có một số thông tin tốt về việc thực hiện nó ở đây:

Performance Tests: Precise Run Time Measurements with System.Diagnostics.Stopwatch

+6

đồng hồ bấm giờ là một phần của Chẩn đoán. Nó có nên được sử dụng trong mã thực không? – Andrey

+4

@Andrey - http://stackoverflow.com/questions/2805362/can-stopwatch-be-used-in-production-code/2805409#2805409 –

+0

Điều này thường chỉ chính xác đến 15ms gần nhất. –

11

Thuộc tính DateTime.Ticks nhận số lượng ve đại diện cho ngày và giờ.

10.000 Ticks là một phần nghìn giây (10.000.000 bọ ve mỗi giây).

+4

Nhưng độ phân giải của Ticks là rất ít hơn 1/10000s, có thể 1/62/1 – codymanix

+2

@codymanix - từ MSDN: 'Một dấu tích đơn thể hiện một trăm nano giây hoặc một phần mười giây của một giây. Có 10.000 ve trong một phần nghìn giây.' –

+5

Chắc chắn là vậy, nhưng hệ điều hành không có độ phân giải chính xác. – codymanix

6

Bạn có thể thử các QueryPerformanceCounter phương pháp tự nhiên. Xem http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html để biết thêm thông tin. Đây là cách sử dụng lớp học Stopwatch.

Xem How to get timestamp of tick precision in .NET/C#? để biết thêm thông tin.

Stopwatch.GetTimestamp() cho phép truy cập đến phương pháp này:

public static long GetTimestamp() { 
    if(IsHighResolution) { 
     long timestamp = 0; 
     SafeNativeMethods.QueryPerformanceCounter(out timestamp); 
     return timestamp; 
    } 
    else { 
     return DateTime.UtcNow.Ticks; 
    } 
} 
+1

AFAIK StopWatch sử dụng QueryPerformanceCounter trong nội bộ nếu có sẵn – codymanix

+0

Đúng, việc triển khai bên trong 'Stopwatch.GetTimestamp()' thực sự cung cấp quyền truy cập vào phương thức đó. –

206
long milliseconds = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 

Đây thực sự là như thế nào phương pháp chuyển đổi Unix khác nhau được thực hiện trong lớp DateTimeOffset (.NET Framework 4.6+, NET Chuẩn 1.3+):

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds(); 
+49

Tiêu đề "thời gian tính bằng mili giây". Câu trả lời này rất hữu ích. – Aerospace

+27

Yup, đối với những người trong chúng ta đang tìm kiếm câu trả lời cho câu hỏi như đã đặt ra, điều này rất hữu ích, cảm ơn bạn. – user430788

+1

Nếu bạn muốn số thập phân (ngay cả khi 'DateTime.Now' không được" cập nhật "rất thường xuyên), tất nhiên sử dụng' thập phân milliseconds = DateTime.Now.Ticks/(thập phân) TimeSpan.TicksPerMillisecond; 'thay thế. –

4

Tôi đã sử dụng DateTime.Now.TimeOfDay.TotalMilliseconds (cho ngày hiện tại), hy vọng nó cũng giúp bạn.

+1

sẽ không trả về các giá trị gia tăng (như ban đầu áp phích yêu cầu) vì TimeOfDay được đặt lại về 0 hàng ngày vào lúc nửa đêm. Thêm vào đó, nó sẽ có cùng các vấn đề tiềm năng mà áp phích được đề cập khi chỉ sử dụng DateTime.Now là nhận được tổng số mili giây từ đó. –

+2

Jim O'Neil Tôi đồng ý với u, đó là lý do tôi đề cập đến "(cho ngày hiện tại)" trong bài đăng của tôi ... Btw, giải pháp của tôi đã giải quyết được vấn đề của mình. để có được phần Mili giây được sử dụng làm bộ đếm, vì vậy tôi đã đăng nó ở đây. Tôi mới ở đây, vì vậy nếu tôi đăng nó ở một nơi sai xin lỗi :) – Sarvan

1

Sử dụng System.DateTime.Now.ToUniversalTime(). Điều đó cho phép bạn đọc ở định dạng mili giây dựa trên tham chiếu đã biết, hoàn toàn loại bỏ thay đổi ngày, v.v.

+0

Điều cần biết, nhưng không liên quan đến câu hỏi được hỏi, đó là về thời gian (đo thời gian), không phải về thời gian giao tiếp chính xác. – ToolmakerSteve

5

Tôi sử dụng lớp sau. Tôi tìm thấy nó trên Internet một lần, được công nhận là tốt nhất NOW().

/// <summary>Class to get current timestamp with enough precision</summary> 
static class CurrentMillis 
{ 
    private static readonly DateTime Jan1St1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    /// <summary>Get extra long current timestamp</summary> 
    public static long Millis { get { return (long)((DateTime.UtcNow - Jan1St1970).TotalMilliseconds); } } 
} 

Không xác định nguồn.

+3

FWIW, toàn bộ điểm của đoạn mã thường được sử dụng này, là tạo một dấu thời gian tương thích với tiêu chuẩn thời gian Unix. Đối với điều đó, nó là rất quan trọng. Nếu một người chỉ muốn làm thời gian, nó là tốn kém không cần thiết. – ToolmakerSteve