फ़ंक्शन जो c # में टाइमस्टैम्प बनाता है


101

मैं सोच रहा था, क्या एक डेटाइम से c # में टाइमस्टैम्प बनाने का कोई तरीका है? मुझे मिलीसेकंड सटीक मूल्य की आवश्यकता है जो कॉम्पैक्ट फ्रेमवर्क में भी काम करता है (यह कहते हुए कि चूंकि DateTime.ToBinary () CF में मौजूद नहीं है)।

मेरी समस्या यह है कि मैं इस मूल्य को डेटाबेस अज्ञेयवादी तरीके से संग्रहीत करना चाहता हूं ताकि मैं इसे बाद में छांट सकूं और यह पता लगा सकूं कि कौन सा मूल्य दूसरे से अधिक है आदि।


2
यहाँ स्वीकृत उत्तर एक अच्छा समाधान देता है, लेकिन यदि आप एक वास्तविक टाइमस्टैम्प चाहते हैं, तो इस क्यू / ए की जाँच करें: stackoverflow.com/questions/9814060/…
inanutshellus

जवाबों:


206

मैं हमेशा निम्नलिखित की तरह कुछ का उपयोग करता हूं:

public static String GetTimestamp(this DateTime value)
{
    return value.ToString("yyyyMMddHHmmssfff");
}

यह आपको 200905211035131468 की तरह एक स्ट्रिंग देगा, क्योंकि स्ट्रिंग टाइमस्टैम्प के उच्चतम क्रम बिट्स से सबसे कम क्रम तक जाती है, आपके एसक्यूएल प्रश्नों में सरल स्ट्रिंग सॉर्टिंग का उपयोग तिथि तक किया जा सकता है यदि आप डेटाबेस में मान चिपका रहे हैं।


5
आप २१ महीने कैसे आए और केवल १२ प्राप्त करें? :)
पॉल बी

2
वर्ष के लिए टोकन यहां कम होना चाहिए: वापसी मान।
डॉन कोटे

1
@RobV प्रश्न मिलीसेकंड सटीकता के लिए पूछता है, इसलिए आपको अंत में 3 'f की आवश्यकता है। आपके 4 'f' में 100 माइक्रोसेड सटीक है।
यूजीन बेरेसोव्स्की

2
ज्ञात हो, कि कॉम्पैक्ट फ्रेमवर्क मिलिसेकंड को स्थानांतरित नहीं करता है। वे हमेशा 0. होंगे। आपको कोड को मॉड करना होगा और कुछ इस तरह जोड़ना होगा: int tick = Environment.TickCount% 1000; int ms = (tick> = MOffset)? (टिक - MOffset): (1000 - (MOffset - tick)); एमएस = मठ।मिन (999, गणित। मोम (0, एमएस));
रेडवुल्फ

43

मेरा मानना ​​है कि आप निम्नलिखित का उपयोग करके एक यूनिक्स शैली डेटस्टैम्प को एक सेकंड के लिए सटीक बना सकते हैं

//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();

हर को समायोजित करने से आप अपने सटीक स्तर को चुन सकते हैं


19

आप DateTime.Ticks प्रॉपर्टी का उपयोग कर सकते हैं, जो एक लंबी और सार्वभौमिक स्टैच्यू है, जो हमेशा बढ़ती रहती है और कॉम्पैक्ट फ्रेमवर्क पर भी उपयोग करने योग्य होती है। बस यह सुनिश्चित करें कि 31 दिसंबर 9999 के बाद आपके कोड का उपयोग नहीं किया गया है;)


जब आप "हमेशा बढ़ते" कहते हैं - इस बात की कोई गारंटी नहीं है कि DateTime.UtcNow.Ticks को दो कॉल करने पर अलग-अलग मूल्य मिलेंगे, हालांकि है? दूसरे शब्दों में, आपको एक अद्वितीय टाइमस्टैम्प के रूप में उपयोग करने से पहले अभी भी कुछ सावधानी की आवश्यकता है।
जॉन स्कीट

9
@Konstantinos: यदि आप टाइमस्टैम्प का उपयोग करते हैं तो आप डुप्लिकेट से बच नहीं सकते। टाइमस्टैम्प का उपयोग अद्वितीय कुंजियों के लिए नहीं किया जाता है, बल्कि एक समय को चिह्नित करने के लिए किया जाता है। आपने कहा कि आपको मिलीसेकंड परिशुद्धता की आवश्यकता है, और टिक्स में 100ns सटीक है। बात यह है कि आपके पास डुप्लिकेट होंगे। यदि आप नहीं चाहते हैं कि आपको DB में एक अद्वितीय अनुक्रम की आवश्यकता है, जो दुर्भाग्य से अज्ञेय नहीं है।
फ्राँस बूमा

3
"यह एक वास्तविक टिक गणना है जो समय के साथ बढ़ती है"। लेकिन सिस्टम क्लॉक पीछे की ओर जा सकता है - जैसे कि डेलाइट सेविंग टाइम के अंत में यदि आप स्थानीय समय का उपयोग कर रहे हैं, या क्योंकि सिस्टम क्लॉक को समायोजित किया गया था।
जो

1
@Frans: बिल्कुल। मैंने केवल टिप्पणी की क्योंकि लोगों को उनके द्वारा चुने गए समाधान के निहितार्थ के बारे में सोचना चाहिए। उदाहरण के लिए, मैं DST की समस्याओं को कम से कम खत्म करने के लिए स्थानीय समय के बजाय UTC का उपयोग करूंगा।
जो

1
@konstantinos: हम्म ... डॉक्स का कहना है कि इसमें 100ns परिशुद्धता है, इसलिए यह वास्तव में अजीब है कि दस्तावेज के साथ यह सटीक नहीं है। शायद यह कॉम्पैक्ट फ्रेमवर्क है, यह बग के बिना कोई फ्रेमवर्क नहीं है
फ्राँस बुमा


4

जब आपको सेकंड में टाइमस्टैम्प की आवश्यकता होती है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;

2

यदि आप टाइमस्टैम्प चाहते हैं जो वास्तविक वास्तविक समय के अनुरूप हैं, लेकिन यह भी चाहते हैं कि वे अद्वितीय हों (किसी दिए गए एप्लिकेशन उदाहरण के लिए), तो आप निम्न कोड का उपयोग कर सकते हैं:

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long orig, newval;
           do
           {
               orig = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newval = Math.Max(now, orig + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newval, orig) != orig);

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