2010-12-29 64 views
41

Trong ứng dụng của tôi, tôi tạo các tệp ở các cơ hội ngẫu nhiên. Để đảm bảo đặt tên duy nhất, tôi đã cố gắng sử dụng các giây nano kể từ 1.1.1970:DateTime.Now.Ticks hoạt động chính xác như thế nào?

long time = DateTime.Now.Ticks; 
String fileName = Convert.ToString(time); 
Console.WriteLine(fileName); 

Bây giờ tôi đã quan sát thấy điều gì đó kỳ lạ. Tại sao đầu ra lại như thế? Tôi có nghĩa là tại sao 4 số cuối luôn giống nhau? Tôi có thể sử dụng nó như một tên tập tin, đó không phải là vấn đề, nhưng tôi chỉ tự hỏi về nó.

634292263478068039 
634292263512888039 
634292263541368039 
634292263603448039 
634292263680078039 
+9

'Ticks' không phải là giây nano kể từ' 1.1.1970', bạn có thể nhầm lẫn với phương thức 'getTime()' của JavaScript. Lấy từ trang web msdn chính thức: * Giá trị của thuộc tính này biểu thị số lượng khoảng thời gian 100 nano giây đã trôi qua kể từ 12:00:00 nửa đêm, ngày 1 tháng 1, 0001 * (http://msdn.microsoft.com/en- us/library/system.datetime.ticks.aspx) –

+4

Để được đánh dấu chính xác không phải là một nano giây, dấu tích được dùng để biểu thị 100 nano giây. –

+0

@Shadow Wizard: có thats những gì tôi cần. –

Trả lời

35

Độ phân giải của DateTime.Now phụ thuộc vào hệ thống hẹn giờ của bạn (~ 10ms trên một hệ điều hành Windows hiện tại) ... do đó, nó đem lại cho giá trị kết thúc cùng ở đó (nó không đếm nữa hữu hạn hơn thế).

+1

Nhưng tại sao chính xác là 39 ở cuối và không phải là số chẵn? – RoflcoptrException

+0

@Roflcoptr - Khi nó bắt đầu đếm, đó là giá trị, sau đó bạn chỉ thấy ~ 10ms increments * từ giá trị ban đầu *, hy vọng tôi đang truyền đạt rõ ràng ... cho tôi biết nếu không. –

+1

Vâng, nó ít nhiều rõ ràng, tôi tự hỏi tại sao giá trị luôn luôn là 39 ngay cả khi tôi khởi động lại máy tính hoặc ứng dụng. – RoflcoptrException

0

để chuyển đổi datetime hiện nộp tên để lưu các tập tin bạn có thể sử dụng

DateTime.Now.ToFileTime()

này nên giải quyết của bạn Mục tiêu

+3

Không phải của tôi downvote ... nhưng điều này sẽ có cùng một vấn đề độ phân giải thời gian như '. Ticks'. –

14

Không thực sự là một câu trả lời cho câu hỏi của bạn như hỏi, nhưng nghĩ tôi sẽ nói về mục tiêu chung của bạn.

Đã có phương pháp tạo tên tệp ngẫu nhiên trong .NET.

Xem System.Path.GetTempFileNameGetRandomFileName.

Ngoài ra, thực hành phổ biến là sử dụng GUID để đặt tên tệp ngẫu nhiên.

+0

Cảm ơn, nhưng phương pháp này trả về tên crypthographic, vì vậy tôi chỉ thích một số con số mà cũng có lợi thế là dễ so sánh với nhau – RoflcoptrException

11

Bạn có thể lấy mili giây kể từ 1970/01/01 sử dụng mã ví dụ:

private static DateTime JanFirst1970 = new DateTime(1970, 1, 1); 
public static long getTime() 
{ 
    return (long)((DateTime.Now.ToUniversalTime() - JanFirst1970).TotalMilliseconds + 0.5); 
} 
+3

o_O -> +0.5 là gì cuối cùng cho?! – Noctis

+3

@Noctis kỹ thuật làm tròn thô tôi đã quen với khi nhập thành số nguyên/dài. 1,9 sẽ được chuyển đổi thành 2 theo cách này, chứ không phải là 1. –

+0

Thú vị ... có lẽ không quan trọng khi bạn đang truyền datetime đến mili giây, nhưng tôi sẽ giữ nó trong tương lai ... :) – Noctis

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