2010-12-29 14 views
41

W mojej aplikacji generuję pliki losowo. Aby zapewnić unikalne nazewnictwo, próbowałem użyć nano sekund od 1.1.1970:Jak działa funkcja DateTime.Now.Ticks?

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

Teraz zaobserwowałem coś dziwnego. Dlaczego wyniki są takie? Chodzi mi o to, dlaczego ostatnie 4 liczby są zawsze takie same? Mogę użyć tego jako nazwy pliku, to nie jest problem, ale po prostu się nad tym zastanawiam.

634292263478068039 
634292263512888039 
634292263541368039 
634292263603448039 
634292263680078039 
+9

"Cwaniaczki" nie są nano sekundami od "1.1.1970", prawdopodobnie jesteście zdezorientowani metodą JavaScript 'getTime()'. Zaczerpnięte z oficjalnej witryny msdn: * Wartość tej właściwości reprezentuje liczbę przedziałów 100-nanosekundowych, które upłynęły od godziny 00:00 północy, 1 stycznia 0001 * (http://msdn.microsoft.com/en- us/library/system.datetime.ticks.aspx) –

+4

Mówiąc dokładniej, kleszcz nie jest nanosekundą, tick ma reprezentować 100 nanosekund. –

+0

@Shadow Wizard: tak, to jest to, czego potrzebuję. –

Odpowiedz

35

Rozdzielczość DateTime.Now zależy od zegara systemowego (~ 10ms na bieżącym systemie operacyjnym Windows) ... więc to daje taką samą wartość końcową tam (nie liczy się nic więcej niż skończony).

+1

Ale dlaczego to dokładnie 39 na końcu, a nie parzysta liczba? – RoflcoptrException

+0

@Roflcoptr - Kiedy zaczęło się liczyć, była to wartość, po czym widać jedynie przyrosty ~ 10ms * od wartości początkowej *, mam nadzieję, że przekazuję to wyraźnie ... daj mi znać, jeśli nie. –

+1

Tak, to jest mniej więcej jasne, po prostu zastanawiam się, dlaczego wartość jest zawsze 39, nawet jeśli ponownie uruchomić komputer lub aplikację. – RoflcoptrException

0

konwertować bieżącego datetime do nazwy pliku do zapisywania plików można użyć

DateTime.Now.ToFileTime()

to powinno rozwiązać swój cel

+3

Nie moja propozycja ... ale to miałoby takie same problemy z rozdzielczością jak '.Ticks'. –

14

Nie naprawdę odpowiedzią na pytanie, jak poprosił, ale pomyślałem, że zetknę się z twoim ogólnym celem.

Istnieje już metoda generowania losowych nazw plików w .NET.

Zobacz System.Path.GetTempFileName i GetRandomFileName.

Alternatywnie często używa się identyfikatora GUID do nadawania nazw losowym plikom.

+0

Dzięki, ale ta metoda zwraca nazwy kryptograficzne, więc wolę tylko kilka liczb, które również mają tę zaletę, że można je łatwo porównać do siebie – RoflcoptrException

11

można uzyskać milisekund od 1/1/1970 pomocą takiego kodu:

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 -> na koniec czego jest +0,5? – Noctis

+3

@Noctis szorstka technika zaokrąglania Przyzwyczaiłem się do tego, że po typecasting do integer/long. 1.9 zostałby przekonwertowany na 2 w ten sposób, a nie na 1. –

+0

Interesujące ... prawdopodobnie nie jest to ważne, gdy przesyłasz datetime do milisekund, ale będę mieć to na przyszłość ... :) – Noctis