आप यूनिक्स युग को C # में वास्तविक समय में कैसे परिवर्तित करते हैं ? (युग की शुरुआत 1/1/1970)
आप यूनिक्स युग को C # में वास्तविक समय में कैसे परिवर्तित करते हैं ? (युग की शुरुआत 1/1/1970)
जवाबों:
मुझे लगता है कि आप यूनिक्स समय का मतलब है , जो 1 जनवरी 1970 को आधी रात (UTC) के बाद से सेकंड की संख्या के रूप में परिभाषित किया गया है।
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);
AddXYZ
विधि का उपयोग करें ।
.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
संपत्ति का उपयोग करें :
DateTime dateTime = dateTimeOffset.UtcDateTime;
'DateTimeOffset' does not contain a definition for 'FromUnixTimeSeconds'
मैं इसे कैसे हल करूंगा?
ल्यूक को सभी श्रेय के साथ, मैंने आसान उपयोग के लिए कुछ विस्तार विधियों को एक साथ रखा है:
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
रिटर्न एक DateTime
एक के साथ Kind
की Utc
है, जो ठीक है, लेकिन इसके बाद के संस्करण 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
) DateTime
के लिए Utc
।
अगर आप युगांतर दिनांक बनाने के लिए नहीं चाहते हैं तो दिनांक समय से आगे बढ़ते समय युगांतर आप भी कर सकते हैं:
public static long ToUnixTime(this DateTime date)
{
return (date.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
ToUnixTime
केवल तभी सही ढंग से काम करता है जब Utc में तारीख होती है। या तो एक चेक जोड़ें, या इसे रूपांतरित करें। (व्यक्तिगत रूप से मैं चेक पसंद करता हूं)
milliseconds
नहीं सेकंड !!!
AddMilliseconds
और आपको डबल नॉट फ्लोट का उपयोग करना चाहिए। अन्यथा आप गलत समय के साथ समाप्त हो जाएंगे।
आप वास्तव में AddMilliseconds (मिलीसेकंड) चाहते हैं, सेकंड नहीं। सेकंड जोड़ने से आप सीमा से बाहर हो जाएंगे।
AddMillis
और यदि आप सेकंड से शुरू कर रहे हैं तो आप स्पष्ट रूप से चाहते हैं AddSeconds
।
यदि आप बेहतर प्रदर्शन चाहते हैं तो आप इस संस्करण का उपयोग कर सकते हैं।
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);
}
Net471 के तहत एक त्वरित बेंचमार्क (बेंचमार्कडॉटनेट) से मुझे यह संख्या मिलती है:
Method | Mean | Error | StdDev | Scaled |
-------------- |---------:|----------:|----------:|-------:|
LukeH | 5.897 ns | 0.0897 ns | 0.0795 ns | 1.00 |
MyCustom | 3.176 ns | 0.0573 ns | 0.0536 ns | 0.54 |
ल्यूक के संस्करण के खिलाफ तेजी से 2x (यदि प्रदर्शन मैटर करता है)
यह आंतरिक रूप से DateTime के कार्य करने के तरीके के समान है।
विधि का उपयोग करें DateTimeOffset.ToUnixTimeMilliseconds () यह 1970-01-01T00: 00: 00.000Z के बाद से समाप्त हो चुके मिलीसेकंड की संख्या देता है।
यह केवल फ्रेमवर्क 4.6 या उच्चतर के साथ समर्थित है
var EPOCH = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
यह अच्छी तरह से यहाँ DateTimeOffset.ToUnixTimeMilliseconds दस्तावेज है
दूसरा तरीका निम्न का उपयोग करना है
long EPOCH = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1,0,0,0,0).Ticks;
सेकंड के साथ © पाने के लिए केवल आप उपयोग कर सकते हैं
var Epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
और निम्न विधि Epoch
से परिवर्तित करेंDateTime
private DateTime Epoch2UTCNow(int epoch)
{
return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch);
}
.Ticks
, तो किसी को DateTime के विकल्प से एक अच्छा TimeSpan उदाहरण मिलेगा।
// 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);
}
DateTime ऑब्जेक्ट के लिए ToUniversalTime () का उपयोग करना चाहिए।
मैं युग परिवर्तन के लिए निम्नलिखित विस्तार विधियों का उपयोग करता हूं
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);
}
केवल मिलिसेकंड या सेकंड का उपयोग करने के बारे में चिंता न करें:
public static DateTime _ToDateTime(this long unixEpochTime)
{
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var date = epoch.AddMilliseconds(unixEpochTime);
if (date.Year > 1972)
return date;
return epoch.AddSeconds(unixEpochTime);
}
यदि युग का समय सेकंडों में है, तो ऐसा कोई तरीका नहीं है जिससे आप वर्ष 1972 को मिलीसेकंड में जोड़ सकें।
यदि आप 4.6 का उपयोग नहीं कर रहे हैं, तो यह स्रोत की मदद कर सकता है : 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;
}
using Microsoft.IdentityModel.Tokens; ... EpochTime.GetIntDate(dateTime);
मामले में आप एक बदलने की आवश्यकता timeval struct (सेकंड, माइक्रोसेकंड) युक्त UNIX time
करने के लिए DateTime
सटीक खोने के बिना, यह कैसे है:
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);
}
चूंकि .Net 4.6 और ऊपर कृपया DateTimeOffset.Now.ToUnixTimeSeconds () का उपयोग करें
यहाँ मेरा समाधान है:
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);
}