मैं 1970 के बाद से दिनांक समय को सेकंड में कैसे बदल सकता हूं?


119

मैं एक C # DateTime चर को यूनिक्स समय में परिवर्तित करने का प्रयास कर रहा हूं, अर्थात, 1 जनवरी, 1970 से सेकंड की संख्या। ऐसा लगता है कि दिनांक 1 जनवरी, 0001 से वास्तव में 'टिक' की संख्या के रूप में लागू किया गया है।

मेरा वर्तमान विचार 1 जनवरी, 1970 को मेरे डेटटाइम से इस तरह घटाना है:

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;

क्या कोई बेहतर तरीका है?


जवाबों:


195

वह मूल रूप से यह है। ये वे विधियाँ हैं जिनका उपयोग मैं यूनिक्स के समय से और उससे बदलने के लिए करता हूँ:

public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    return origin.AddSeconds(timestamp);
}

public static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    TimeSpan diff = date.ToUniversalTime() - origin;
    return Math.Floor(diff.TotalSeconds);
}

अद्यतन: .Net Core 2.1 और .Net मानक 2.1 के अनुसार, यूनिक्स एपोच के बराबर एक डेटाइम, स्थैतिक से प्राप्त किया जा सकता है DateTime.UnixEpoch


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

3
मेरे लिए काम नहीं किया। इस जवाब ने चाल
चली

@ जॉनी - टूयूनिवर्सल टाइम () यूटीसी में परिवर्तित होता है, इसलिए यह यूटीसी के लिए खाता है।
डेव स्वार्स्की

4
दिनांक समय उत्पत्ति = नया दिनांक समय (1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); दिलचस्प है कि किसी ने यह सुझाव नहीं दिया। बहुत बार आपके पास Utc समय का प्रतिनिधित्व करने वाले मिलीसेकंड होंगे। और यदि आपके t specify this explicitly and somewhere later in code youपास खराब यूटीसी समय समाप्त होने से पहले ToUniversalTime () होगा, क्योंकि डिफ़ॉल्ट रूप से DateTime यूटीसी नहीं है।
स्टीविया

52

यदि आपका बाकी सिस्टम DateTime के बजाय DateTimeOffset के साथ ठीक है, तो वास्तव में सुविधाजनक सुविधा है:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

7
यह एक क्लीनर तरीका है, लेकिन यह केवल फ्रेमवर्क 4.6 msdn.microsoft.com/en-us/library/…
ऑस्कर फ्रैक्सेडास

1
अच्छा लगा। और निश्चित रूप से यूनिक्स से डेटटाइम ओफसेट जाने के लिए, आप var time = DateTimeOffset.FromUnixTimeSeconds(5000); एमएस डॉक का
जॉर्डन

22

केवल एक चीज जो मैं देख रहा हूं, वह मध्यरात्रि 1 जनवरी, 1970 यूटीसी के बाद की है

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;

7
क्या यह DateTime.UtcNow होना चाहिए?
इंरी जू

14

आप संभवत: Timezone समस्या से बचने के लिए DateTime.UtcNow का उपयोग करना चाहते हैं

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 

टाइमज़ोन के मुद्दों से बचने का एकमात्र तरीका 1 है) आनंद से अनभिज्ञ रहें, और केवल एक टाइमज़ोन का समर्थन करें, या 2) किसी अन्य सिस्टम या अंत-उपयोगकर्ता के साथ इंटरफ़ेस करने के लिए हर समय टाइमज़ोन (कम से कम) को हैंडल करें। विशेष रूप से, आंतरिक रूप से हर जगह यूटीसी का उपयोग करना लड़ाई का केवल एक हिस्सा है। पहले परिदृश्य में, UTC डेटाटाइम्स जोड़ना वास्तव में समस्या को बदतर बना देता है, जब तक कि आप सभी (2) करने के लिए तैयार नहीं होते, क्योंकि आप किसी भी एक समयक्षेत्र का समर्थन करने से केवल UTC का समर्थन करते हैं।
jpaugh

1

यह दृष्टिकोण अच्छा होगा यदि प्रश्न में दिनांक-समय UTC में है, या किसी ऐसे क्षेत्र में स्थानीय समय का प्रतिनिधित्व करता है, जिसने कभी दिन के समय की बचत का समय नहीं देखा है। डेटटाइम अंतर रूटीन डेलाइट सेविंग टाइम को ध्यान में नहीं रखते हैं, और परिणामस्वरूप 1 जून की आधी रात को 1 जनवरी को मध्यरात्रि के बाद 24 घंटे के कई होने के रूप में माना जाएगा। मैं विंडोज में कुछ भी अनजान हूं जो वर्तमान के लिए ऐतिहासिक डेलाइट-सेविंग नियमों की रिपोर्ट करता है। स्थानीय, इसलिए मुझे नहीं लगता कि सबसे हाल के डेलाइट सेविंग नियम में बदलाव से पहले किसी भी समय को सही तरीके से संभालने का कोई अच्छा तरीका है।


0

आप DateTime का एक StartTime और EndTime बना सकते हैं, फिर endTime.Subtract (startTime) करें। फिर अपने स्पैन का उत्पादन करें। सेकंड्स।

मुझे लगता है कि काम करना चाहिए।


0

मैं अपने कैलकुलस में एपोच टाइम के बजाय वर्ष 2000 का उपयोग करता हूं। छोटी संख्या के साथ काम करना स्टोर करना और परिवहन करना आसान है और JSON अनुकूल है।

वर्ष 2000 युग के दूसरे 946684800 पर था।

वर्ष 2000 जनवरी 0001 के 1-सेंट से दूसरे 63082281600 पर था।

DateTime.UtcNow टिक्स, जनवरी 0001 के 1-सेंट से शुरू होता है

वर्ष 2000 से सेकंड :

DateTime.UtcNow.Ticks/10000000-63082281600

यूनिक्स समय से सेकंड:

DateTime.UtcNow.Ticks/10000000-946684800

उदाहरण के लिए वर्ष 2020 है:

var वर्ष 2020 = (नया दिनांक समय ())। AddYears (2019)। // क्योंकि डेटटाइम पहले ही वर्ष 1 से शुरू हो जाता है

637134336000000000 जनवरी 0001 के 1 सेंट के बाद से

जनवरी 0001 के 1-सेंट के बाद से 63713433600 सेकंड

युग के बाद से 1577836800 सेकंड

वर्ष 2000 से 631152000 सेकंड

संदर्भ:

एपोच समय कनवर्टर: https://www.epochconverter.com

वर्ष 1 कनवर्टर: https://www.epochconverter.com/seconds-days-since-y0

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