2010-05-21 14 views
275

आप यूनिक्स epoch time को सी # में वास्तविक समय में कैसे परिवर्तित करते हैं? (युग 1970/01/01 शुरुआत)आप सी # में युग समय कैसे बदलते हैं?

+1

जब तक मुझे कुछ याद नहीं आ रहा है, तो "युग" केवल एक विशेष टाइमकीपिंग योजना का मूल बिंदु है। उदाहरणों में 1/1/0001, 1/1/1970 और 1/1/2000 शामिल हैं। यह एक योजना (उदाहरण के लिए, जूलियन) के बजाय एक योजना की अधिक विशेषता है। –

+5

युग के बाद से समय 1 जनवरी 1 9 70 यूटीसी के बाद से सेकंड की संख्या है। –

+12

@ टेलर यह यूनिक्स समय के लिए युग है, और यह शायद सही है, लेकिन यह एकमात्र वैध युग नहीं है। यूनिक्स समय उपयोगकर्ताओं को उस बिंदु पर खुद को भ्रमित नहीं करना चाहिए। –

उत्तर

441

मुझे लगता है कि तुम्हारा मतलब Unix time, जो बाद आधी रात (UTC) सेकंड की संख्या के रूप में परिभाषित किया गया है 1 जनवरी 1970

public static DateTime FromUnixTime(long unixTime) 
{ 
    return epoch.AddSeconds(unixTime); 
} 
private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
+52

के लिए है, इसे सही तरीके से काम करने के लिए मुझे बदलना पड़ा। AddSeconds को .ddMilliseconds। सही परिणाम प्राप्त करने के लिए आपको यह जानने की आवश्यकता होगी कि आपका नंबर सेकेंड या मिलीसेकंड से आ रहा है या नहीं। तो उदाहरण के लिए निम्नलिखित तिथि: 1406310305188 (25 जुलाई 2014)।http://www.epochconverter.com/ आपको अपने रूपांतरण परिणामों की जांच करने देगा। – jrandomuser

+3

आपको या तो पैरामीटर प्रकार को डबल में बदलना चाहिए (क्योंकि AddSeconds डबल स्वीकार करता है और इसलिए डबल डाउनकास्ट हो जाएगा) या विधि विवरण में अस्वीकरण जोड़ें कि तर्क में परिशुद्धता के 64 बिट्स में से केवल 53 संरक्षित किए जाएंगे। – tomosius

+3

@jrandomuser: यूनिक्स युग के समय से यूनिक्स युग परंपरा पारंपरिक रूप से * सेकंड * के रूप में दर्शायी जाती है। एपोक (उदाहरण के लिए, जावास्क्रिप्ट) के बाद से * मिलीसेकंड * का उपयोग करने के लिए यह आम हो गया है, लेकिन क्लासिक परिभाषा सेकंड है। नीचे की रेखा, बस जानें कि आपका इनपुट मान क्या है (सेकंड, मिलीसेकंड, टिक, जो भी हो) और सही 'AddXYZ' विधि का उपयोग करें। –

135

LukeH करने के लिए सभी क्रेडिट के साथ , मैं एक साथ रख दिया आसान उपयोग के लिए कुछ विस्तार तरीके:

public static DateTime FromUnixTime(this long unixTime) 
{ 
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return epoch.AddSeconds(unixTime); 
} 

public static long ToUnixTime(this DateTime date) 
{ 
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return Convert.ToInt64((date - epoch).TotalSeconds); 
} 

नोट CodesInChaos से नीचे टिप्पणी है कि ऊपर FromUnixTime रिटर्न Utc एक की, Kind जो ठीक है के साथ एक DateTime, लेकिन अब ओवी ToUnixTime उसमें अधिक संदेहजनक है कि DateTime किस प्रकार के date के लिए जिम्मेदार नहीं है। के लिए date के Kind अनुमति देने के लिए किया जा रहा है या तो Utc या Local, ToUniversalTime का उपयोग करें:

public static long ToUnixTime(this DateTime date) 
{ 
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds); 
} 

ToUniversalTime एक Local (या Unspecified) DateTimeUtc में बदल जाएगा।

यदि आप जब DATETIME से चलती इपोक आप भी कर सकते हैं युग दिनांक समय उदाहरण बनाना चाहते हैं न:

public static long ToUnixTime(this DateTime date) 
{ 
    return (date.ToUniversalTime().Ticks - 621355968000000000)/10000000; 
} 
+5

'ToUnixTime' यूटीसी में दिनांक होने पर ही सही तरीके से काम करता है। या तो एक चेक जोड़ें, या इसे परिवर्तित करें। (व्यक्तिगत रूप से मैं चेक पसंद करता हूं) – CodesInChaos

+1

बस पिछले घंटे बिताया कि यह क्यों काम नहीं करता है। आपको 'मिलीसेकंड्स * * नहीं * सेकंड में काम करने की ज़रूरत है !!! – KristianB

+7

@ क्रिस्टियनबी: "यूनिक्स टाइम" परंपरागत रूप से सेकेंड है, मिलिसेकंड नहीं, क्योंकि एपोक, हालांकि इन दिनों मैं यह जांचने के लिए सावधान हूं कि कोई परिभाषा किस प्रकार उपयोग कर रही है। सेकंड्स काफी अच्छे थे, और हमने 32-बिट मानों पर द एपोक के दोनों तरफ एक उचित सीमा दी। (और यही कारण है कि 1 9 जनवरी को 3:14 बजे के बाद, 2038 जीएमटी कुछ के लिए एक बुरा समय हो सकता है ...) मिलीसेकंड का उपयोग करना एक और आधुनिक अभ्यास है, जो नियमित रूप से लगभग 64-बिट मानों को फेंकने में सक्षम होता है (दोनों अभिन्न और डबल-परिशुद्धता आईईईई -754) ... –

6
// convert datetime to unix epoch seconds 
public static long ToUnixTime(DateTime date) 
{ 
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds); 
} 

दिनांक समय वस्तु के लिए ToUniversalTime() का उपयोग करना चाहिए।

17

आप वास्तव में AddMilliseconds (मिलीसेकंड) जोड़ना चाहते हैं, सेकेंड नहीं। सेकंड जोड़ना आपको सीमा अपवाद से बाहर कर देगा।

+0

वह क्यों है? http://www.epochconverter.com/ यह कहता है कि आप 1/1/970 नहीं एमएस के बाद से सेकंड की संख्या में जोड़ते हैं। –

+0

यदि आप एमएस से जा रहे हैं तो आप स्पष्ट रूप से 'AddMillis' चाहते हैं और यदि आप सेकंड से शुरू कर रहे हैं तो आप स्पष्ट रूप से 'AddSeconds' चाहते हैं। – Shoe

+0

मुझे वही समस्या थी जब मैं सेकंड का उपयोग करते समय सीमा से बाहर निकल रहा था। यूनिक्स समय मैं कनवर्ट करने की कोशिश कर रहा था मिलीसेकंड में था। मैंने सोचा कि यह सेकंड में था। मुझे लगता है कि कुछ यूनिक्स समय मिलीसेकंड में मापा जाता है। – DoodleKana

-3

यहाँ मेरी समाधान है:

public long GetTime() 
{ 
    DateTime dtCurTime = DateTime.Now.ToUniversalTime(); 

    DateTime dtEpochStartTime = Convert.ToDateTime("1/1/1970 0:00:00 AM"); 

    TimeSpan ts = dtCurTime.Subtract(dtEpochStartTime); 

    double epochtime; 

    epochtime = ((((((ts.Days * 24) + ts.Hours) * 60) + ts.Minutes) * 60) + ts.Seconds); 

    return Convert.ToInt64(epochtime); 
} 
+7

यह खाता लीप साल और लीप सेकंड आदि के लिए करता है? – Jodrell

+1

पिछली टिप्पणी पर विस्तार करने के लिए, यहां एक छोटा वीडियो है जो बताता है कि समय जटिल क्यों है और आपको इसे स्वयं करने का प्रयास क्यों नहीं करना चाहिए: https://www.youtube.com/watch?v=-5wpm-gesOY – vmrob

0

मामले में आप एक timeval struct (सेकंड, माइक्रोसेकंड) परिशुद्धता खोने के बिना DateTime को UNIX time युक्त बदलने की आवश्यकता, यह कैसे:

DateTime _epochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
private DateTime UnixTimeToDateTime(Timeval unixTime) 
{ 
    return _epochTime.AddTicks(
     unixTime.Seconds * TimeSpan.TicksPerSecond + 
     unixTime.Microseconds * TimeSpan.TicksPerMillisecond/1000); 
} 
117

latest version of .Net (v4.6) यूनिक्स समय रूपांतरणों के लिए अभी अंतर्निहित समर्थन जोड़ा गया। इसमें यूनिक्स समय के लिए या तो सेकंड या मिलीसेकंड द्वारा प्रतिनिधित्व किया गया है।

    सेकंड में
  • यूनिक्स समय DateTimeOffset रहे हैं:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000); 
  • DateTimeOffset सेकंड में यूनिक्स समय के लिए:

long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds(); 
    मिलीसेकेंड में
  • यूनिक्स समय DateTimeOffset रहे हैं:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000); 
  • DateTimeOffset मिलीसेकेंड में यूनिक्स समय के लिए:

long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds(); 

नोट: इन विधियों को और DateTimeOffset से परिवर्तित करते हैं। एक DateTime प्रतिनिधित्व बस DateTimeOffset.DateTime संपत्ति का उपयोग प्राप्त करने के लिए: यदि आप 4.6 का उपयोग नहीं कर रहे हैं, तो

DateTime dateTime = dateTimeOffset.UtcDateTime; 
+0

मैं हूं 'डेटटाइम ऑफसेट' प्राप्त करने में 'FromUnixTimeSeconds' की परिभाषा नहीं है 'मैं इसे हल करने के बारे में कैसे जाऊं? –

+0

@HappyBird क्या आप .NET 4.6 या ऊपर हैं? – i3arnon

0

, इस मदद मिल सकती है स्रोत:System.IdentityModel.Tokens

/// <summary> 
    /// DateTime as UTV for UnixEpoch 
    /// </summary> 
    public static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 

    /// <summary> 
    /// Per JWT spec: 
    /// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time. 
    /// </summary> 
    /// <param name="datetime">The DateTime to convert to seconds.</param> 
    /// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks> 
    /// <returns>the number of seconds since Unix Epoch.</returns> 
    public static long GetIntDate(DateTime datetime) 
    { 
     DateTime dateTimeUtc = datetime; 
     if (datetime.Kind != DateTimeKind.Utc) 
     { 
      dateTimeUtc = datetime.ToUniversalTime(); 
     } 

     if (dateTimeUtc.ToUniversalTime() <= UnixEpoch) 
     { 
      return 0; 
     } 

     return (long)(dateTimeUtc - UnixEpoch).TotalSeconds; 
    }  
4

मैं युग परिवर्तन के लिए विस्तार तरीकों का पालन का उपयोग

public static int GetEpochSeconds(this DateTime date) 
    { 
     TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1); 
     return (int)t.TotalSeconds; 
    } 

public static DateTime FromEpochSeconds(this DateTime date, long EpochSeconds) 
    { 
     var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
     return epoch.AddSeconds(EpochSeconds); 

    } 
1

यदि आप बेहतर प्रदर्शन चाहते हैं तो आप इस संस्करण का उपयोग कर सकते हैं।

public const long UnixEpochTicks = 621355968000000000; 
public const long TicksPerMillisecond = 10000; 
public const long TicksPerSecond = TicksPerMillisecond * 1000; 

//[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static DateTime FromUnixTimestamp(this long unixTime) 
{ 
    return new DateTime(UnixEpochTicks + unixTime * TicksPerSecond); 
} 

त्वरित बेंचमार्क (BenchmarkDotNet) net471 के तहत से मैं इस नंबर मिल:

 Method |  Mean |  Error | StdDev | Scaled | 
-------------- |---------:|----------:|----------:|-------:| 
StackOverflow | 5.897 ns | 0.0897 ns | 0.0795 ns | 1.00 | 
     MyCustom | 3.176 ns | 0.0573 ns | 0.0536 ns | 0.54 | 

2x तेजी LukeH संस्करण के खिलाफ (यदि प्रदर्शन मेटर)

यह इसी तरह की है कि कैसे दिनांक समय आंतरिक रूप से काम करते हैं।

संबंधित मुद्दे