मिलीसेकंड में डेटाइम का प्रतिनिधित्व?


81

मेरे पास एसक्यूएल-सर्वर टाइमस्टैम्प है जिसे मुझे 1970 के बाद से मिलीसेकंड में समय के प्रतिनिधित्व में बदलने की आवश्यकता है। क्या मैं सादे एसक्यूएल के साथ ऐसा कर सकता हूं? यदि नहीं, तो मैंने इसे DateTimeC # में एक चर में निकाला है । क्या इस का एक मिलीसेक प्रतिनिधित्व प्राप्त करना संभव है?

धन्यवाद,
तेजा।


1
बाद के प्रश्न के लिए: (now - Epoch).TotalMillisecondsकहाँ nowऔर Epochदिनांकित वस्तुएँ हैं।

जवाबों:


144

आप शायद यूटीसी-जैसे टाइमस्टैम्प में बदलने की कोशिश कर रहे हैं, जो यूटीसी में हैं:

yourDateTime.ToUniversalTime().Subtract(
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    ).TotalMilliseconds

यह भी गर्मियों के मुद्दों से बचा जाता है, क्योंकि UTC उन नहीं है।


2
यह आउटपुट के रूप में एक अंश देता है, उदाहरण के लिए: "1552678714362.79" ".79" कहां से आ रहा है?
शरीफ यज़्दियान

2
@SharifYazdian यह वही है जो आप उम्मीद करेंगे, यह 0.79 मिलीसेकंड है। सिस्टम का समय टिक्स में मापा जाता है। यह देखते हुए कि 1 मिलीसेकंड में 10000 टिक होते हैं, DateTimeऔर TimeSpanअपने मूल्यों को पूरे मिलीसेकंड की तुलना में उच्च परिशुद्धता के साथ संग्रहीत करते हैं। 0.79 एमएस = 7900 टिक। यदि आपको पूरी संख्या की आवश्यकता है, तो आप उपयोग कर सकते हैं long ms = myTimeSpan.TotalTicks / 10000;
LWChris

2
.NET Core (> 2.1) में आप DateTime.UnixEpochतिथि घोषित करने के बजाय उपयोग कर सकते हैं ।
Thom

1
इस कोड में एक समस्या है: यह मानता है DateTime(अनुबंध में नोट देखें ToUniversalTime) स्थानीय समय में है जो यह नहीं हो सकता है। उदाहरण के लिए समय के साथ नमूना लेना आम है DateTime.UtcNowया यह किसी अन्य समयक्षेत्र में हो सकता है।
सीकेटोको

70

C # में, आप लिख सकते हैं

(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds

15
मैं longइसके बजाय कास्ट को सुझाव देता हूं int:)
जॉन स्कीट

4
new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);अगर आप दूसरे रास्ते से जाना चाहते हैं।
जैकमोरसी 16

@JackMorrissey: AddMilliseconds()प्रकार के एक परमवीर की अपेक्षा करता है double। एक निहित रूपांतरण इसका ध्यान रखता है, लेकिन यह ध्यान देने योग्य हो सकता है।
एक्सल केम्पर

@JonSkeet आप इंट के बजाय लंबे समय तक कास्टिंग करने का सुझाव क्यों देते हैं? :)
रॉक्सी’प्रो २ '

4
@ रॉक्सी'प्रो: int.MaxValueमिलीसेकंड में लगभग 25 दिन है। यह उपयोगी होने की संभावना नहीं है।
जॉन स्कीट

35

.NET 4.6 के अनुसार, आप DateTimeOffsetयूनिक्स मिलीसेकंड प्राप्त करने के लिए किसी ऑब्जेक्ट का उपयोग कर सकते हैं । इसमें एक कंस्ट्रक्टर है जो एक DateTimeऑब्जेक्ट लेता है , इसलिए आप नीचे दिखाए गए अनुसार बस अपनी ऑब्जेक्ट में पास कर सकते हैं।

DateTime yourDateTime;
long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, सुनिश्चित करें yourDateTimeकि सही Kindनिर्दिष्ट है, या .ToUniversalTime()इसे यूटीसी समय में बदलने के लिए उपयोग करें।

यहाँ आप के बारे में अधिक जान सकते हैं DateTimeOffset


1
ToUnixTimeMilliseconds () वास्तव में .net 3.5 में मौजूद नहीं है।
निकोलेकार्नो

2
MSDN के अनुसार , ToUnixTimeMilliseconds().NET 4.6 के बाद से उपलब्ध है
NM

1
@kayleeFrye_onDeck ओपी एक डेटाबेस से खींची गई टाइमस्टैम्प के बारे में पूछ रहा है, इसलिए .Nowइस बारे में आपकी टिप्पणी सीधे इस प्रश्न पर लागू नहीं होती है।
बॉब

2
SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000

यह आपको पूर्ण सटीकता नहीं देता है, लेकिन DATEDIFF(MS...अतिप्रवाह का कारण बनता है। यदि सेकंड पर्याप्त हैं, तो यह करना चाहिए।


2

गुप्त डेटा के लिए यह अन्य समाधान unixtimestampmillis C # के लिए है।

private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static long GetCurrentUnixTimestampMillis()
{
    DateTime localDateTime, univDateTime;
    localDateTime = DateTime.Now;          
    univDateTime = localDateTime.ToUniversalTime();
    return (long)(univDateTime - UnixEpoch).TotalMilliseconds;
} 

1

एंडोमा के उत्तर का उपयोग करना, यही मैं कर रहा हूं

आप इस तरह की एक संरचना या एक वर्ग बना सकते हैं

struct Date
    {
        public static double GetTime(DateTime dateTime)
        {
            return dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
        }

        public static DateTime DateTimeParse(double milliseconds)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds).ToLocalTime();
        }

    }

और आप इसे अपने कोड में निम्नानुसार उपयोग कर सकते हैं

DateTime dateTime = DateTime.Now;

double total = Date.GetTime(dateTime);

dateTime = Date.DateTimeParse(total);

उम्मीद है इससे आपको मदद होगी


1

DateTimeExtensions क्लास में तरीके ToUnixTime()और ToUnixTimeMs()तरीके हैं

DateTime.UtcNow.ToUnixTimeMs()

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