DateTime.Now मिलीसेकंड परिशुद्धता के साथ प्राप्त करें


231

मैं वास्तव में मिलीसेकंड परिशुद्धता के साथ वास्तविक समय का एक समय टिकट कैसे बना सकता हूं?

मुझे 16.4.2013 9: 48: 00: 123 कुछ चाहिए। क्या यह संभव है? मेरे पास एक आवेदन है, जहां मैं प्रति सेकंड 10 बार मूल्यों का नमूना लेता हूं, और मुझे उन्हें एक ग्राफ में दिखाने की आवश्यकता है।



ज्ञात रहे कि कई उत्तर hhघंटों (मानक समय) का उपयोग कर रहे हैं । टाइमस्टैम्प (और कई अन्य मामलों में) के मामले में इसे संभवतः tt(am / pm) के साथ जोड़ा जाना चाहिए या HH(सैन्य समय) द्वारा प्रतिस्थापित किया जाना चाहिए ।
गोज

जवाबों:


304

मैं वास्तव में मिलीसेकंड परिशुद्धता के साथ वास्तविक समय का एक समय टिकट कैसे बना सकता हूं?

मुझे संदेह है कि आपको मिलीसेकंड सटीकता का मतलब हैDateTimeबहुत सटीकता है, लेकिन सटीकता के मामले में काफी मोटे हैं। आम तौर पर बोल, तुम नहीं कर सकते। आमतौर पर सिस्टम क्लॉक (जो DateTime.Nowइसका डेटा कहां से प्राप्त होता है) का रिज़ॉल्यूशन लगभग 10-15 ms है। अधिक विवरण के लिए सटीकता और सटीकता के बारे में एरिक लिपर्ट का ब्लॉग पोस्ट देखें।

यदि आपको इससे अधिक सटीक समय की आवश्यकता है, तो आप एनटीपी क्लाइंट का उपयोग करना चाह सकते हैं।

हालांकि, यह स्पष्ट नहीं है कि आपको वास्तव में यहां मिलीसेकंड सटीकता की आवश्यकता है। यदि आप सटीक समय के बारे में परवाह नहीं करते हैं - आप सिर्फ "बहुत अच्छा" सटीकता के साथ सही क्रम में नमूने दिखाना चाहते हैं, तो सिस्टम घड़ी ठीक होनी चाहिए। मैं आपको सलाह दूंगा कि आप दिन के उजाले में होने वाले संक्रमण से बचने के लिए समय क्षेत्र के मुद्दों से बचने के DateTime.UtcNowबजाय उपयोग करें DateTime.Now

यदि आपका प्रश्न वास्तव मेंDateTime मिलीसेकंड परिशुद्धता के साथ एक स्ट्रिंग में बदलने के आसपास है , तो मैं सुझाव दूंगा:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

(ध्यान दें कि आपके नमूने के विपरीत, यह छांटने योग्य है और आस-पास भ्रम पैदा करने की संभावना है कि क्या यह "महीना / दिन / वर्ष" या "दिन / महीना / वर्ष" है।)


5
@antonio: "काम नहीं करता" की तुलना में अधिक जानकारी के साथ मैं और कोई सहायता नहीं दे सकता।
जॉन स्कीट

हां, मैं अधिक जानकारी प्रदान कर सकता हूं: "{0: yyyyMMdd HH: mm: ss.fff}", DateTime.UtcNow -> 20180502 11: 07: 20.000 Win32.GetSignTime (ref stime) -> 2018,2,5,11 , 7,20,0 (ymdh mm ss ms) मैं मिलीसेकंड के साथ दिनांक समय का एक उदाहरण बना सकता हूं: var dt = new DateTime (2018, 5, 2, 19, 34, 55, 200); "{0: yyyyMMdd HH: mm: ss.fff}", dt -> 20180502 19: 34: 55.200 .Net कॉम्पैक्ट फ्रेमवर्क, विंडोज एंबेडेड कॉम्पैक्ट 7, ARM Cortex-A8 पर
Antonio

@antonio: तो ऐसा लगता है कि आप जिस हार्डवेयर का उपयोग कर रहे हैं, उसके संस्करण का उपयोग कर रहे हैं। आप केवल उप-सटीकता प्रदान नहीं करते हैं - या आप इसे दूसरी सीमा पर कॉल करने के लिए हुआ है। (यदि आप DateTime.UtcNowबार-बार मारते रहते हैं , तो क्या यह केवल एक बार प्रति सेकंड की वृद्धि होती है? आपने वह नहीं दिखाया है।)
जॉन स्कीट

जब मैं टिक्स को DateTime.Now से पुनः प्राप्त करता हूं, तो मान छोटा हो जाता है: टिक्स 636534596580000000 डेटिक्स टिक्स 20180205 20: 34: 18.000 से। सीमा कठिन / सॉफ्टवेयर में है, मुझे लगता है। मैं स्टॉपवॉच वर्ग का उपयोग कर रहा हूं, इसके बजाय धन्यवाद जॉन
एंटोनियो

@antonio: यह संभवतः इस बिंदु पर शामिल डिवाइस के पूर्ण विवरण के साथ एक नया प्रश्न बनाने के लायक है।
जॉन स्कीट

117

यह काम करना चाहिए:

DateTime.Now.ToString("hh.mm.ss.ffffff");

यदि आपको इसे प्रदर्शित करने की आवश्यकता नहीं है और बस समय के अंतर को जानना है, तो इसे स्ट्रिंग में परिवर्तित न करें। बस इसे छोड़ दो,DateTime.Now();

और TimeSpanसमय अंतराल के बीच अंतर जानने के लिए उपयोग करें:

उदाहरण

DateTime start;
TimeSpan time;

start = DateTime.Now;

//Do something here

time = DateTime.Now - start;
label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0'));

मुझे इसके साथ गणना करने की आवश्यकता है, इसलिए मैं इसे स्ट्रिंग में परिवर्तित नहीं कर सकता।
लकीएचके

25

मैं एक समान समाधान की तलाश कर रहा था, इस धागे पर जो सुझाव दिया गया था, उसके आधार पर, मैं निम्नलिखित का उपयोग करता हूं DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff") , और यह आकर्षण की तरह काम करता है। नोट: यह .fffसटीक संख्या है जिसे आप कैप्चर करना चाहते हैं।


1
यदि तारीख दोपहर में है (सुबह 4 बजे), जैसा कि सुबह में दिखाया जाएगा। FIX: उपयोग HH(सैन्य समय) या जोड़ें tt(PM या AM)। जैसा कि इस उदाहरण में दिखाया गया है: repl.it/KGr3/1
Jaider

22

इस तरह से मिलीसेकंड और प्रारूप के साथ डेटटाइम संरचना का उपयोग करें:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");

16

Pyromancer का जवाब मुझे बहुत अच्छा लगता है, लेकिन शायद आप चाहते थे:

DateTime.Now.Millisecond

लेकिन अगर आप तारीखों की तुलना कर रहे हैं, तो TimeSpan जाने का रास्ता है।


15
नोट: यदि आप एक TimeSpan के रूप में दो DateTimes के बीच अंतर की तुलना कर रहे हैं, तो आपको चाहिए TotalMilliseconds। Milliseconds में वर्तमान Milliseconds काउंटर है, जो कभी भी 1000 से अधिक नहीं होता है, जबकि TotalMilliseconds के पास कुल मिलिसेकंड होता है जो युग के बाद समाप्त हो जाता है।
कंटैंगो

4

यदि आप अभी भी अन्य उत्तरों की तरह एक स्ट्रिंग के बजाय एक तारीख चाहते हैं, तो बस इस एक्सटेंशन विधि को जोड़ें।

public static DateTime ToMillisecondPrecision(this DateTime d) {
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute,
                        d.Second, d.Millisecond, d.Kind);
}

3

जहाँ तक मैं इस प्रश्न को समझता हूँ, आप इसके लिए जा सकते हैं:

DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

यह 1 मिलीसेकंड से छोटे टिक्स को काट देगा।


हां, लेकिन DateTime.Now का वास्तविक रिज़ॉल्यूशन लगभग 16 ms से अधिक नहीं हो सकता है।
पीटर मोर्टेंसन

2

के साथ परेशानी DateTime.UtcNowऔर DateTime.Nowकि, कंप्यूटर पर निर्भर करता है और प्रणाली के संचालन, यह केवल सही 10 से 15 के बीच और मिलीसेकंड करने के लिए हो सकता है। हालाँकि, विंडोज़ कंप्यूटरों पर कोई भी निम्न स्तर के फ़ंक्शन GetSystemsPreciseAsFileTime का उपयोग करके माइक्रोसेकंड सटीकता प्राप्त कर सकता है, GetTimeStamp()नीचे फ़ंक्शन देखें।

    [System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")]
    static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct FileTime  {
        public const long FILETIME_TO_DATETIMETICKS = 504911232000000000;   // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7
        public uint TimeLow;    // least significant digits
        public uint TimeHigh;   // most sifnificant digits
        public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } }     // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32
        public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } }
    }

    public static DateTime GetTimeStamp() { 
        FileTime ft; GetSystemTimePreciseAsFileTime(out ft);
        return ft.dateTime;
    }

बहुत बहुत धन्यवाद। मैं इसे इतनी देर से खोज रहा हूं। क्या यह किसी भी प्रदर्शन के मुद्दों का कारण है और क्या उत्पादन कोड का उपयोग करना सुरक्षित है?
मुहमेट गोटुर्क अयान

0

datetime.now.ticks का उपयोग करके देखें। यह नैनोसेकंड सटीक प्रदान करता है। दो टिकों (स्टॉपिक - स्टार्टिक) / 10,000 का डेल्टा लेना निर्दिष्ट अंतराल का मिलीसेकंड है।

https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2


-2
public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

यदि आप माइक्रोसेकंड चाहते हैं, तो बस बदल 10000दें 10, और यदि आप 10 वें माइक्रो चाहते हैं, तो हटा दें / 10000


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