C # का उपयोग करके मिलीसेकंड में समय प्राप्त करें


131

मैं एक कार्यक्रम बना रहा हूं, जिसमें मुझे मिलीसेकंड में समय प्राप्त करने की आवश्यकता है। समय के साथ, मेरा मतलब एक ऐसी संख्या से है जो कभी भी अपने आप के बराबर नहीं होती है, और हमेशा एक दूसरे की तुलना में 1000 नंबर बड़ी होती है। मैं DateTime.Nowएक से परिवर्तित करने की कोशिश की है TimeSpanऔर उस TotalMillisecondsसे हो रही है ... लेकिन मैंने सुना है यह पूरी तरह से सही नहीं है।

क्या इसे करने का कोई आसान रास्ता है?


क्या आप किसी भी दो कॉल की उम्मीद कर रहे हैं ताकि हमेशा बढ़ते मूल्यों का नेतृत्व किया जा सके? सामान्य तौर पर, न्यूनतम अंतराल की तुलना में करीब कॉल करता है जो टाइमर रिज़ॉल्यूशन की अनुमति देता है वही मूल्य प्राप्त करेगा। आपको नकली-सटीक सीरियललाइज़र के रूप में अपने स्वयं के टाईब्रेकर को जोड़ना होगा।
स्टीवन सुदित

16
"एक संख्या जो स्वयं के बराबर कभी नहीं होती है"। जो लगता है ... जटिल। ;)
मिज़िपोर

1
NaN वास्तव में उस आवश्यकता को फिट करेगा। "एक संख्या नहीं" होने के बावजूद, यह एक संख्या प्रकार है, और यह स्वयं के बराबर नहीं है।
Y29295

जवाबों:


78

Stopwatchकक्षा का उपयोग करें ।

तरीकों और गुणों का एक सेट प्रदान करता है जिसका उपयोग आप बीते हुए समय को सटीक रूप से मापने के लिए कर सकते हैं।

इसे यहाँ लागू करने के बारे में कुछ अच्छी जानकारी है:

प्रदर्शन टेस्ट: सिस्टम के साथ सटीक रन टाइम माप। डायग्नोस्टिक्स.टॉप वॉच


8
स्टॉपवॉच डायग्नोस्टिक्स का हिस्सा है। क्या इसे वास्तविक कोड में उपयोग किया जाना चाहिए?
एंड्री


यह आमतौर पर निकटतम 15ms या तो सटीक है।
स्टीवन सुदित

11
हालांकि यह कितना महंगा है? शायद हमें स्टॉपवॉच बंद करना चाहिए :)
jb।

3
@Steven, जो OS और अंतर्निहित हार्डवेयर पर निर्भर करता है। यदि उपलब्ध उच्च रिज़ॉल्यूशन टाइमर का उपयोग किया जाता है, जो कि सभी मौजूदा डेस्कटॉप और सर्वर आधारित x86 विंडोज संस्करणों के लिए है, जिनके बारे में मुझे पता है। अधिक जानकारी के लिए आवृत्ति और IsHighResolution गुणों की जाँच करें। OS स्तर पर, QueryPerformanceCounter और QueryPerformanceFrequency निम्न-स्तरीय API हैं जो इस कार्यक्षमता को वापस करते हैं।
क्रिस टेलर

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

यह वास्तव में DateTimeOffsetकक्षा में विभिन्न यूनिक्स रूपांतरण विधियों को कैसे लागू किया जाता है (.NET फ्रेमवर्क 4.6+, .NET मानक 1.3+):

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

65
शीर्षक "मिलीसेकंड में समय मिलता है"। यह उत्तर सहायक है।
एयरोस्पेस

33
हाँ, हम में से उन लोगों के लिए जो प्रश्न के उत्तर के लिए खोज रहे थे, यह बहुत उपयोगी था, धन्यवाद।
user430788

1
यदि आप डेसीमल चाहते हैं (भले ही DateTime.Now"बहुत बार" अपडेट नहीं किया गया हो), तो decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;इसके बजाय निश्चित रूप से उपयोग करें ।
जेपी स्टिग नीलसन

1
यह खोज परिणामों के लिए चयनित उत्तर की तुलना में बहुत अधिक उपयोगी है और यहां तक ​​कि मैं मूल प्रश्न से क्या इकट्ठा करता हूं।
बोगी

1
इस जवाब से मेरी जान बच गई। समान कोड मिला, लेकिन काम नहीं करता है। क्यों नहीं पता लगा सका। फिर मैंने longमिलीसेकंड के सामने डेटाटाइप देखा । intअतिप्रवाह का उपयोग करना ।
फिसन

13

DateTime.Ticksसंपत्ति टिक कि दिनांक और समय का प्रतिनिधित्व की संख्या हो जाता है।

10,000 टिक्स एक मिलीसेकंड (प्रति सेकंड 10,000,000 टिक) है।


4
लेकिन टिक्स का रिज़ॉल्यूशन 1 /
10000s

2
@कोडिमिक्स - एमएसडीएन से:A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.
कारो

5
यकीन है कि यह है, लेकिन ऑपरेटिंग सिस्टम के पास इस सटीक होने का संकल्प नहीं है।
कोडायनामिक्स

6
@codymanix सही है। सादृश्य से, एक एंगस्ट्रॉम लंबाई की एक इकाई है; दस अरब एंगस्ट्रॉम एक मीटर बनाते हैं। आप एक ऐसा फ़ंक्शन लिख सकते हैं जो आपकी ऊंचाई को एंगस्ट्रॉम में 64 बिट पूर्णांक के रूप में रिपोर्ट करता है, लेकिन अगर आपके पास सब कुछ एक सेंटीमीटर सटीक है, तो यह तथ्य कि फ़ंक्शन उप-नैनोमीटर परिशुद्धता का प्रतिनिधित्व करता है पूरी तरह से अप्रासंगिक है। कम महत्वपूर्ण अंक कचरा होने जा रहे हैं।
एरिक लिपर्ट

4
@RedFilter: यदि आप वास्तव में अपनी उम्र को निकटतम मिलीसेकंड के लिए जानते थे, तो आप गर्भधारण को कुछ इस तरह कह सकते हैं, "जब मैं फिर से पलक झपकाऊंगा, तो मेरी उम्र x मिलीसेकंड होगी।" गहरी समस्या संचार नहीं है बल्कि माप है: आपके जन्म को निकटतम दूसरे तक भी ज्ञात होने की संभावना नहीं है।
स्टीवन सुदित

11

मैं निम्न वर्ग का उपयोग करता हूं। मैंने इसे एक बार इंटरनेट पर पाया, अब सबसे अच्छा माना जाता है ()

/// <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); } }
}

स्रोत अज्ञात


5
एफडब्ल्यूआईडब्ल्यू, इस आमतौर पर इस्तेमाल किए जाने वाले स्निपेट का पूरा बिंदु, एक टाइमस्टैम्प बनाना है जो यूनिक्स टाइमस्टैम्प मानक के साथ संगत है। उसके लिए, यह महत्वपूर्ण है। अगर कोई सिर्फ टाइमिंग करना चाहता है, तो यह अनावश्यक रूप से महंगा है।
टूलमेकरसेव

8

आप QueryPerformanceCounterदेशी तरीका आजमा सकते हैं । अधिक जानकारी के लिए http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html देखें । यह Stopwatchवर्ग उपयोग करता है।

देखें कि कैसे .NET / C # में टिक परिशुद्धता का टाइमस्टैम्प प्राप्त किया जाए? अधिक जानकारी के लिए।

Stopwatch.GetTimestamp() इस विधि का उपयोग करता है:

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

1
AFAIK स्टॉपवॉच आंतरिक रूप से उपलब्ध
QuerPerformanceCounter

हां, Stopwatch.GetTimestamp()वास्तव में आंतरिक कार्यान्वयन उस पद्धति तक पहुंच प्रदान करता है।
पीटर वैन जिंकेल

5

मैंने DateTime.Now.TimeOfDay.TotalMilliseconds (वर्तमान दिन के लिए) का उपयोग किया, आशा है कि यह आपकी मदद करता है।


1
टाइमऑफडे को आधी रात को शून्य पर रीसेट करने के बाद से बढ़ते मूल्यों (मूल पोस्टर के रूप में आवश्यक) को वापस नहीं किया जाएगा। इसके अलावा इसमें वही संभावित मुद्दे होंगे जो पोस्टर ने सिर्फ डेटाइम का उपयोग करते समय उल्लेख किया था। अब उससे कुल मिलीसेकंड मिल रहा है।
जिम ओ 'नील

3
जिम ओ 'नील मैं यू से सहमत हूं, इसीलिए मैंने अपनी पोस्ट में "(वर्तमान दिन के लिए)" का उल्लेख किया है ... Btw, मेरे समाधान ने मेरी समस्या के लिए काम किया, क्योंकि मेरी समस्या तारीख-विशिष्ट नहीं है, मुझे बस प्राप्त करने की आवश्यकता है मिलिसेकंड भाग एक काउंटर के रूप में उपयोग किया जाना है, इसलिए मैंने इसे यहां पोस्ट किया है। मैं यहां नया हूं, इसलिए अगर मैंने इसे गलत जगह पोस्ट किया तो मुझे खेद है :)
सरवन

2

का उपयोग करें System.DateTime.Now.ToUniversalTime()। यह आपके पढ़ने को एक ज्ञात संदर्भ-आधारित मिलीसेकंड प्रारूप में डालता है, जो दिन परिवर्तन आदि को पूरी तरह से समाप्त कर देता है।


जानने के लिए अच्छा है, लेकिन पूछे जाने वाले प्रश्न के लिए प्रासंगिक नहीं है, जो कि समय (समय बीतने का माप) के बारे में है, न कि सही समय पर संवाद करने के बारे में।
टूलमेकरसेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.