2011-01-31 37 views
5

Tôi đang làm việc với .NET nhưng tôi cần giao tiếp với dịch vụ ghi nhật ký, dựa trên Unix, dự kiến ​​giây và micro giây kể từ thời gian của thời đại Unix. Số giây có thể dễ dàng khôi phục được bằng cách thực hiện như sau:Có tương đương với "gettimeofday" trong .NET

DateTime UnixEpoch = new DateTime(1970, 1, 1); 
TimeSpan time = DateTime.UtcNow() - UnixEpoch 
int seconds = (int) time.TotalSeconds 

tuy nhiên, tôi không chắc chắn cách tính micro giây. Tôi có thể sử dụng thuộc tính TotalMilliseconds và chuyển đổi nó thành micro giây nhưng tôi tin rằng đánh bại mục đích sử dụng micro giây như một phép đo chính xác. Tôi đã xem xét sử dụng các lớp StopWatch nhưng nó không có vẻ như tôi có thể hạt giống nó với một thời gian (ví dụ Unix Epoch).

Cảm ơn.

Trả lời

12

Sử dụng thuộc tính Ticks để nhận mức chi tiết chi tiết nhất. Một đánh dấu là 100ns, vì vậy chia cho 10 để đến micro giây.

Tuy nhiên, điều đó nói về độ chính xác đại diện - nó không nói về độ chính xác hoàn toàn. Với độ chi tiết thô của DateTime.UtcNow Tôi không mong đợi nó sẽ đặc biệt hữu ích. Xem thêm blog post about the difference between precision and accuracy của Eric Lippert để biết thêm thông tin.

Bạn có thể muốn bắt đầu đồng hồ bấm giờ tại một thời điểm đã biết và về cơ bản thêm thời gian của nó vào "điểm xuất phát". Lưu ý rằng "bọ ve" từ Stopwatch không có nghĩa là giống như TimeSpan.Ticks.

+0

Đây sẽ là câu trả lời của tôi, nhưng tôi không biết độ phân giải của một Tick. Làm cái này. Ngoại trừ, kể từ 100ns = .1us, bạn không nên chia ve cho 10 để nhận được micro giây? – KeithS

+0

Đây là câu trả lời hay nhất, vì nó cung cấp độ chính xác cao nhất từ ​​'UtcNow()', nhưng tôi nghĩ thuộc tính 'Ticks' thực sự không chính xác lắm. –

+0

@Keith: Rất tiếc, có, sửa lỗi :) –

4

Từ Epoch Converter:

epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000)/10000000; 

này sẽ cắt nó vì phân chia số nguyên, do đó hãy chắc nó 10000000.0 để duy trì phần phụ thứ hai, hoặc chỉ không làm các bộ phận.

Điều quan trọng cần lưu ý là thuộc tính .Ticks bạn nhận được liên quan đến ngày 1 tháng 1, 0001 và không ngày 1 tháng 1 năm 1970 như trong UNIX, đó là lý do tại sao bạn cần trừ số đó ở trên.

chỉnh sửa: chỉ để rõ ràng, hằng số khó chịu đó chỉ là số lượng bọ ve trong khoảng thời gian từ ngày 1 tháng 1 đến 00 tháng 1 năm 1970 ở UTC. Nếu bạn lấy phần giây của nó (62135596800) và chia cho (365 * 24 * 60 * 60) bạn thấy bạn nhận được một số gần với 1970, tất nhiên là không chính xác năm 1970 do điều chỉnh bước nhảy vọt.

1

DateTime.Ticks đại diện cho đơn vị 100 nano giây kể từ 01 tháng 1, 0001.

0

Trên các CPU hiện đại với động thay đổi tốc độ xung nhịp, nó rất khó khăn (hoặc đắt tiền) để có được chính xác thời gian phụ millisecond.

tôi muốn đề nghị rằng bạn chỉ cần nhân Milliseconds sở hữu bởi 1000.

Sử dụng Ticks như Jon gợi ý, nhưng tôi nghĩ rằng độ chính xác của bạn vẫn sẽ là trong khu phố của 1ms.

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