আপনি কীভাবে সি # তে যুগের সময় রূপান্তর করবেন?


377

আপনি কিভাবে ইউনিক্স এ কনভার্ট করব যুগান্তকারী সময় C # রিয়েল টাইমে মধ্যে? (প্রথম যুগের 1/1/1970)


1
আমি যদি কিছু মিস করছি না, তবে "যুগ" হ'ল একটি নির্দিষ্ট সময় রক্ষণাবেক্ষণের মূল উত্স। উদাহরণগুলির মধ্যে রয়েছে 1/1/0001, 1/1/1970 এবং 1/1/2000। এটি নিজেরাই কোনও স্কিমের (উদাহরণস্বরূপ, জুলিয়ান) এর চেয়ে কোনও স্কিমের বৈশিষ্ট্য।
বব কাউফম্যান

8
পর্বের পর থেকে সময়টি 1 জানুয়ারি, 1970 ইউটিসি থেকে সেকেন্ডের সংখ্যা।
টেলর লিজ

13
@ টেলর এটি ইউনিক্সের সময়ের যুগ, এবং সম্ভবত এটি সঠিক, তবে এটি একমাত্র বৈধ যুগের নয়। ইউনিক্স সময়ের ব্যবহারকারীদের সেই পয়েন্টটিতে নিজেকে বিভ্রান্ত করা উচিত নয়।
জোয়েল কোহোর্ন

DUP, অন্যান্য উত্তরের সঙ্গে: stackoverflow.com/q/3354893/712526
jpaugh

উত্তর:


563

আমি অনুমান করি যে আপনি ইউনিক্স সময় বলতে চাইছেন , যা 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);

74
এটি সঠিকভাবে কাজ করার জন্য আমাকে পরিবর্তন করতে হয়েছিল .সেকেন্ডগুলি .ডাডমিলিসেকেন্ডগুলিতে যুক্ত করুন। সঠিক ফলাফল পেতে আপনার নম্বরটি সেকেন্ড বা মিলিসেকেন্ড থেকে আসছে কিনা তা জানতে হবে। সুতরাং উদাহরণস্বরূপ নিম্নলিখিত তারিখটি: 1406310305188 (জুলাই 25 2014)। epochconverter.com আপনাকে আপনার রূপান্তর ফলাফলগুলি পরীক্ষা করতে দেয়।
jrandomuser

5
আপনি হয় প্যারামিটারের ধরনটি দ্বিগুণ করতে হবে (কারণ অ্যাডসেকেন্ডস দ্বিগুণ গ্রহণ করে এবং তাই ডাবলকাস্টটি দ্বিগুণ হয়ে যাবে) বা পদ্ধতি বিবরণে একটি অস্বীকৃতি যুক্ত করুন যে যুক্তিতে 64 বিটগুলির মধ্যে কেবল 53 টি সংরক্ষণ করা হবে।
টমোসিয়াস

6
@ জরানডমুজার: ইউনিক্স যুগের সময়টি traditionতিহ্যগতভাবে পর্বের সময় থেকে কয়েক সেকেন্ড হিসাবে উপস্থাপিত হয় । ইপচ (উদাহরণস্বরূপ, জাভাস্ক্রিপ্ট) থেকে মিলি সেকেন্ড ব্যবহার করা সাধারণ হয়ে গেছে তবে ক্লাসিক সংজ্ঞাটি সেকেন্ডের। নীচের লাইনে, আপনার ইনপুট মানটি কী তা সেকেন্ডে (সেকেন্ড, মিলিসেকেন্ড, টিক্স, যাই হোক না কেন) জেনে নিন এবং সঠিক AddXYZপদ্ধতিটি ব্যবহার করুন ।
টিজে ক্রাউডার

প্রথমে অ্যাডমিলিসেকেন্ডগুলি দিয়ে চেষ্টা করুন এবং যদি বছরটি এখনও 1970 হয় তবে অ্যাডসেকেন্ডগুলি করুন। এইভাবে এটি মিলিসেকেন্ড বা সেকেন্ডের সম্পর্কে চিন্তা না করে সর্বদা কাজ করবে। এছাড়াও আপনি একটি ওভারফ্লো উত্সাহ প্রতিরোধ করতে পারেন। অ্যাডসেকেন্ডে একটি বিশাল সংখ্যা পাস করা কোড ক্র্যাশ করবে
টোনো নাম

213

নেট (v4.6) এর সর্বশেষ সংস্করণ য্বেয্বে বিল্ট-ইন ইউনিক্স সময় রূপান্তরের জন্য সমর্থন। এটিতে ইউনিক্স সময় এবং সেকেন্ড বা মিলিসেকেন্ড দ্বারা প্রতিনিধিত্ব করা উভয়ই অন্তর্ভুক্ত।

  • সেকেন্ডে ইউনিক্স সময় DateTimeOffset:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
  • DateTimeOffset সেকেন্ডে ইউনিক্স সময় থেকে:

long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
  • মিলিসেকেন্ডে ইউনিক্স সময় থেকে DateTimeOffset:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
  • DateTimeOffset মিলিসেকেন্ডে ইউনিক্স সময়:

long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();

দ্রষ্টব্য: এই পদ্ধতিগুলি রূপান্তর করে এবং সেখান থেকে DateTimeOffsetDateTimeউপস্থাপনা পেতে কেবল DateTimeOffset.DateTimeসম্পত্তিটি ব্যবহার করুন :

DateTime dateTime = dateTimeOffset.UtcDateTime;

1
আমি পাচ্ছি আমি 'DateTimeOffset' does not contain a definition for 'FromUnixTimeSeconds'কীভাবে এটি সমাধান করতে চাই?
শুভ পাখি

@ হ্যাপিবার্ড আপনি কি নেট 4.6 বা তার উপরে?
i3arnon 15

একই জিনিস - 4.7.2 এবং DateTimeOffset জন্য কোন FromUnixTimeMilliseconds পদ্ধতি আছে ...
Mikhail_Sam

আমি বুঝতে পেরেছি. আমার নতুন অবজেক্ট তৈরি করার দরকার নেই। এটি একটি স্থির পদ্ধতি।
মিখাইল_সামত

আমি প্রথম নজরে ডিফল্ট মানগুলি কিছুটা বিভ্রান্ত পেয়েছি। বিসি 1000 হ'ল মিলিস থেকে সেকেন্ডে রূপান্তর করার ফ্যাক্টর।
ব্লু ই

169

লূকএইচকে সমস্ত creditণ দিয়ে, আমি সহজে ব্যবহারের জন্য কিছু এক্সটেনশন পদ্ধতি একসাথে রেখেছি:

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);
}

কোডসইনচাউস থেকে নীচে দেওয়া মন্তব্যটি নোট করুন যে উপরেরটি FromUnixTimeএকটি DateTimeদিয়ে একটি Kindপ্রদান করে Utc, যা ভাল, তবে উপরেরটি আরও বেশি সন্দেহযুক্ত যে প্রদত্ত ToUnixTimeকোন ধরণের জন্য অ্যাকাউন্ট করে না । অনুমতি দেওয়ার জন্য এর সত্তার পারেন বা , ব্যবহার :DateTimedatedateKindUtcLocalToUniversalTime

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;
}

6
ToUnixTimeতারিখটি ইউটিসি তে থাকলে সঠিকভাবে কাজ করে। হয় একটি চেক যোগ করুন, বা এটি রূপান্তর। (ব্যক্তিগতভাবে আমি চেকটি পছন্দ করি)
কোডসইনচাউস

2
এটি কেন কাজ করে না তা সবেমাত্র গত ঘন্টাটি ব্যয় করে। আপনার সেকেন্ডে milliseconds নয় কাজ করা দরকার !!!
ক্রিস্টিয়ানবি

7
@ ক্রিশ্চিয়ানোবি: "ইউনিক্স সময়" traditionতিহ্যগতভাবে কয়েক সেকেন্ডের, মিলি সেকেন্ড নয়, ইপোকের পরে, যদিও এই দিনগুলিতে কেউ কোন সংজ্ঞা ব্যবহার করছে তা খতিয়ে দেখতে আমি যত্নবান। সেকেন্ডগুলি যথেষ্ট ভাল ব্যবহৃত হত, এবং স্বাক্ষরিত 32-বিট মানগুলিতে ইপোকের উভয় পক্ষকে আমাদের যুক্তিসঙ্গত পরিসর দেয়। (এবং কেন ১৯ শে জানুয়ারী ভোর :14:৪৪ পরে কিছুটা সময় জিএমটি GMT এর জন্য খারাপ সময় হতে পারে ...) আমাদের নিয়মিতভাবে 64৪-বিট মানগুলি (প্রায় উভয়ই অবিচ্ছেদ্য) ছুঁড়ে ফেলতে পারার জন্য মিলি সেকেন্ড ব্যবহার করা আরও আধুনিক অনুশীলন thanks এবং ডাবল-স্পষ্টতা আইইইই -754) ...
টিজে ক্রাউডার

5
কোডের জন্য ধন্যবাদ। ইপচ বেস তৈরি করার সময় কেবলমাত্র একটি সামান্য সুপারিশ: স্পষ্টভাবে মিলিসেকেন্ড মানটি 0 তে নির্ধারণ করতে ভুলবেন না, যেমন ভেরোপজ = নতুন ডেটটাইম (1970, 1, 1, 0 / * এইচ * /, 0 / * মি * /, 0 / * এস * /, 0 / * এমএস * /, ডেটটাইমকিন্ড.ইউটিসি); আপনি যদি এটি পরিষ্কারভাবে সেট না করেন তবে মিলিসেকেন্ড মানটি 1 হিসাবে বেরিয়ে আসে বলে মনে হচ্ছে এটি আমার পরীক্ষাগুলিতে কিছু অসঙ্গতি সৃষ্টি করেছিল।
ctrlplusb

1
আপনার ব্যবহার করা উচিত AddMillisecondsএবং আপনার ডাবল নট ফ্লোট ব্যবহার করা উচিত। অন্যথায় আপনি একটি ভুল সময় শেষ করতে হবে।
এক্সেল

25

আপনি আসলে অ্যাডমিলিসেকেন্ডস (মিলিসেকেন্ডস) চান, সেকেন্ড নয়। সেকেন্ড যোগ করা আপনাকে সীমার বাইরে ব্যতিক্রম দেয়।


কেন এমন? epochconverter.com এটি বলছে আপনি 1/1/970 থেকে এমএস না করে সেকেন্ডের সংখ্যায় যুক্ত হন।
জ্যামি আর রাইতলেস্কি

আপনি যদি এমএস থেকে চলে যান AddMillisতবে আপনি অবশ্যই চান এবং আপনি যদি সেকেন্ড থেকে শুরু করেন তবে আপনি অবশ্যই চান AddSeconds
জুতো

সেকেন্ড ব্যবহার করার সময় আমার একই সমস্যা ছিল যে আমি সীমার বাইরে চলে যাচ্ছিলাম। আমি যে ইউনিক্সটি রূপান্তর করার চেষ্টা করছিলাম সেটি মিলি সেকেন্ডে ছিল। আমি ভেবেছিলাম এটি সেকেন্ডের মধ্যে ছিল। আমার ধারণা কিছু ইউনিক্স সময় মিলিসেকেন্ডে পরিমাপ করা হয়।
ডুডলকানা

ইউনিক্স সময় সাধারণত সেকেন্ডে প্রকাশ করা হয় তবে 0.001 একটি সেকেন্ডের বৈধ সংখ্যা (= 1 এমএস)। সন্দেহ হলে, সর্বাধিক সম্ভব নির্ভুলতা ব্যবহার করুন।
স্কট

9

আপনি যদি আরও ভাল পারফরম্যান্স চান তবে আপনি এই সংস্করণটি ব্যবহার করতে পারেন।

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);
}

নেট ৪4১ এর অধীনে একটি দ্রুত বেঞ্চমার্ক (বেঞ্চমার্কডটনেট) থেকে আমি এই নম্বরটি পেয়েছি:

        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 দ্রুত (পারফরম্যান্সের ক্ষেত্রে যদি)

এটি ডেটটাইম অভ্যন্তরীণভাবে কীভাবে কাজ করে তার অনুরূপ।


9

পদ্ধতি ব্যবহার করুন DateTimeOffset.ToUnixTimeMilliseconds () 00:: এটা মিলিসেকেন্ড যে 1970-01-01T00 থেকে অতিবাহিত করেছি সংখ্যা ফেরৎ 00.000Z।

এটি কেবল ফ্রেমওয়ার্ক 4.6 বা ততোধিকের সাথে সমর্থিত

var EPOCH = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

এটি এখানে ডেটটাইমঅফসেট.টোইউনিক্সটাইমমিলিসেকেন্ডগুলি ভালভাবে নথিভুক্ত

অন্য উপায়টি নিম্নলিখিতটি ব্যবহার করা

long EPOCH = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1,0,0,0,0).Ticks;

সেকেন্ডের সাথে EPOCH পেতে আপনি কেবল ব্যবহার করতে পারেন

 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দিলে ডেটটাইম বিয়োগ থেকে একটি ভাল টাইমস্প্যান উদাহরণ ফিরে আসবে।
ব্যবহারকারী 2864740

8
// 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 () ব্যবহার করা উচিত।


5

আমি যুগের রূপান্তরের জন্য নিম্নলিখিত এক্সটেনশন পদ্ধতিগুলি ব্যবহার করি

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);

    }

2

মিলিসেকেন্ড বা সেকেন্ড ব্যবহারের বিষয়ে চিন্তা না করার জন্য কেবল এটি করুন:

    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 মিলিসেকেন্ড যুক্ত করে বছর পাস করার কোনও উপায় নেই।


1

আপনি যদি 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);
তরল পদার্থটি

0

যদি আপনি একটি রূপান্তর করতে হবে 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);
}

0

নেট 4.. and এবং তারপরে দয়া করে ডেটটাইমঅফসেট.নিউ. টো ইউনিক্সটাইমসেকেন্ডস () ব্যবহার করুন


-4

এখানে আমার সমাধান:

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
পূর্ববর্তী মন্তব্যে প্রসারিত করতে এখানে একটি ছোট ভিডিও দেওয়া আছে যা ব্যাখ্যা করে যে সময় কেন জটিল এবং কেন আপনি নিজে এটি করার চেষ্টা করবেন না: youtube.com/watch?v=-5wpm-gesOY
vmrob
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.