সি # তে কীভাবে ইউনিক্স টাইমস্ট্যাম্প পাবেন


398

আমি স্ট্যাকওভারফ্লোটি প্রায় দেখেছি এবং এমনকি কিছু প্রস্তাবিত প্রশ্নের দিকে তাকিয়েছি এবং কেউ উত্তর দিচ্ছে বলে মনে হচ্ছে না, আপনি কীভাবে সি # তে ইউনিক্স টাইমস্ট্যাম্প পাবেন?


উত্তর:


597

আপনি DateTime.UtcNow1970-01-01 এর যুগের সময়কে ব্যবহার করে এবং বিয়োগ করে সি # তে একটি ইউনিক্স টাইমস্ট্যাম্প পেয়েছেন ।

যেমন

Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

DateTime.UtcNowDateTimeআপনি যে কোনও অবজেক্টের জন্য ইউনিক্স টাইমস্ট্যাম্প পেতে চান তা প্রতিস্থাপন করা যেতে পারে ।

এখানে একটি ক্ষেত্রও রয়েছে, DateTime.UnixEpochযা এমএসএফটি দ্বারা খুব খারাপভাবে নথিভুক্ত করা হয় তবে এর বিকল্প হতে পারেnew DateTime(1970, 1, 1)


28
@ ডাব্লুফুয়ের পক্ষে মন্তব্য করছি। "এই উত্তর Int32 সীমা যা, আমি বিশ্বাস করি, 2.147.483.647 সঙ্গে সীমাবদ্ধতা রয়েছে। অনুযায়ী onlineconversion.com/unix_time.htm মঙ্গল, 19 জানুয়ারী 2038 একটি সময় 03:14:07 জিএমটি আমি কোনো বিকল্প সংখ্যা টাইপ অনুমান করার এই সমান , ডাবল, লম্বা ইত্যাদির চূড়ান্তভাবে একটি সীমাও থাকবে তবে আমি এটি উল্লেখ করার মতো বলে মনে করেছি a আমি পুরো সংখ্যাটি চেয়েছিলাম তাই এখানে
দীর্ঘই বেছে নিয়েছি

11
ইউনিক্স টাইমস্ট্যাম্পটি traditionতিহ্যগতভাবে একটি 32 বিট পূর্ণসংখ্যার, এবং '1970-01-01 00:00:01' ইউটিসি থেকে '2038-01-19 03:14:07' ইউটিসি এর পরিসীমা।
the_nuts

88
ক্রেজি যে ইউনিক্স সময় রূপান্তরটি ডেটটাইমের অংশ হিসাবে স্ট্যান্ডার্ড লাইব্রেরিতে নেই।
xingyu

7
বা পূর্ণসংখ্যার অ্যারিথমেটিক ব্যবহার করে:DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks / TimeSpan.TicksPerSecond;
আন্তন

2
বিয়োগের তারিখের সময় ইউটিসি হওয়ার দরকার নেই?
jjxtra

570

নেট 4.6 হিসাবে, আছে DateTimeOffset.ToUnixTimeSeconds()


এটি একটি উদাহরণ পদ্ধতি, সুতরাং আপনি এটির উদাহরণ হিসাবে কল করবেন বলে আশা করা হচ্ছে DateTimeOffset। আপনি যেকোন উদাহরণ কাস্ট করতে পারেন DateTime, যদিও টাইমজোন থেকে সাবধান থাকুন

বর্তমান টাইমস্ট্যাম্প পেতে:

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

একটি থেকে টাইমস্ট্যাম্প পেতে DateTime:

DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();

126
ভাল. এটি প্রায় সময়
bizzehdee

35
@ ম্যাটবোর্জা ধন্যবাদ, এটি আবার ফিরে আসে Int64- যতক্ষণ না গড়িয়ে যায়, আমরা পৃথিবীর অভাবের জন্য পৃথিবী বছরগুলি আর ব্যবহার করব না।
বব

24
অন্য কারও জন্য ভাবছেন, আপনি বর্তমান টাইমস্ট্যাম্পটি পেতে পারেনDateTimeOffset.Now.ToUnixTimeSeconds()
kR105

8
@ বিজেজেদী, পুন ইচ্ছা?
st0le

5
আপনি ইউটিসি ইউনিক্সটাইমস্ট্যাম্পটি এর সাথে পেতে পারেন: ডেটটাইমঅফসেট.উটকনউ.টুকুউনিক্সটাইমসেকেন্ডস ()
ইয়ার লেভি

39

আপনি টিক্সও ব্যবহার করতে পারেন। আমি উইন্ডোজ মোবাইলের জন্য কোডিং করছি তাই পদ্ধতিগুলির সম্পূর্ণ সেট না রাখুন। টোটাল সেকেন্ড আমার কাছে উপলভ্য নয়।

long epochTicks = new DateTime(1970, 1, 1).Ticks;
long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);

অথবা

TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = unixTicks.TotalSeconds;

1
দ্বিতীয় সমাধানের জন্য ত্রুটি: উত্স টাইপ 'ডাবল' টার্গেট 'দীর্ঘ' রূপান্তর করতে পারে না।
পিক্সার

@ পিক্সার: দ্বিতীয় নমুনা ঠিক করা হয়েছে
জেবার্ট

5
new DateTime(1970, 1, 1)অনির্দিষ্ট Kindসম্পত্তি সহ একটি সময় তৈরি করে । new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)আপনি যা সত্যই সত্য হতে চান
বিচ্ছিন্ন করুন

.NET কোর 2.1 আপনি নতুন তারিখসময় পরিবর্তে DateTime.UnixEpoch ব্যবহার করতে পারেন (1970, 1, 1) থেকে দেখতে docs.microsoft.com/en-us/dotnet/api/...
Jaa এইচ

27

এটি আমি ব্যবহার করি:

public long UnixTimeNow()
{
    var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
    return (long)timeSpan.TotalSeconds;
}

মনে রাখবেন যে এই পদ্ধতিটি সমন্বিত ইউনিভিরাল সময় (ইউটিসি) হিসাবে সময়টি ফিরিয়ে দেবে।


(টোটাল সেকেন্ডস doubleটাইপ করেছে ; দীর্ঘ দিন এটি ingালাই নির্ভুলতার ক্ষতি ঘটাবে ))
ফ্র্যাঙ্কিশ

ঠিক বলেছেন, তবে আমাদের কয়েক হাজার বছর ধরে এটি নিয়ে চিন্তা করতে হবে না :)
বার্তোমিজেজ মুচা

21

সংক্ষিপ্তকরণ .TotalSecondsগুরুত্বপূর্ণ হিসাবে এটি সংজ্ঞায়িত করা হয়the value of the current System.TimeSpan structure expressed in whole fractional seconds.

এবং কিভাবে একটি এক্সটেনশন সম্পর্কে DateTime? দ্বিতীয়টি সম্ভবত আরও বিভ্রান্তিকর যে সম্পত্তির এক্সটেনশন উপস্থিত না হওয়া পর্যন্ত এটি মূল্যবান।

/// <summary>
/// Converts a given DateTime into a Unix timestamp
/// </summary>
/// <param name="value">Any DateTime</param>
/// <returns>The given DateTime in Unix timestamp format</returns>
public static int ToUnixTimestamp(this DateTime value)
{
    return (int)Math.Truncate((value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
}

/// <summary>
/// Gets a Unix timestamp representing the current moment
/// </summary>
/// <param name="ignored">Parameter ignored</param>
/// <returns>Now expressed as a Unix timestamp</returns>
public static int UnixTimestamp(this DateTime ignored)
{
    return (int)Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
}

2
এক্সটেনশন পদ্ধতিটি পরিষ্কারভাবে এটি পরিষ্কার করার উপায়। এটি একটি দুর্দান্ত, পরিপক্ক উত্তর - এবং কেন এত কম ভোট হয়েছে তা আমি বুঝতে পারি না। অত্যন্ত নিশ্চিত যে রব্বা সঠিক - আউটপুটটি (ইনট) হিসাবে স্বয়ংক্রিয়ভাবে ফলাফলকে ছাঁটাই করে। (আক্ষরিক অর্থে ডাবলের দশমিক অংশ উপেক্ষা করে)।
স্টিফানি

4
(এই ডেটটাইম উপেক্ষা করা হয়েছে) খুব, খুব বিভ্রান্তিকর
লার্স কর্নেলিয়াসসেন

6

আপনি যখন বর্তমান সময় থেকে ১৯ 1970০ বিয়োগ করবেন তখন সচেতন থাকবেন যে টাইমস্প্যানে প্রায়শই একটি শূন্য মিলি সেকেন্ড ক্ষেত্র থাকবে। যদি কোনও কারণে আপনি মিলিসেকেন্ডে আগ্রহী হন তবে এটি মনে রাখবেন।

এই সমস্যাটি পেতে আমি যা করেছি তা এখানে।

 DateTime now = UtcNow();

 // milliseconds Not included.
 DateTime nowToTheSecond = new DateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second); 

 TimeSpan span = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0));

 Assert.That(span.Milliseconds, Is.EqualTo(0)); // passes.

5

এটিই আমি ব্যবহার করি।

 public class TimeStamp
    {
        public Int32 UnixTimeStampUTC()
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
}

সম্ভবত এটি
ডেটটাইমের

3

আমি এই ইউটিলিটি পদ্ধতির সর্বাধিক মার্জিত পন্থাগুলি একসাথে বিভক্ত করেছি:

public static class Ux {
    public static decimal ToUnixTimestampSecs(this DateTime date) => ToUnixTimestampTicks(date) / (decimal) TimeSpan.TicksPerSecond;
    public static long ToUnixTimestampTicks(this DateTime date) => date.ToUniversalTime().Ticks - UnixEpochTicks;
    private static readonly long UnixEpochTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
}

2

এই সমাধানটি আমার পরিস্থিতিতে সহায়তা করেছে:

   public class DateHelper {
     public static double DateTimeToUnixTimestamp(DateTime dateTime)
              {
                    return (TimeZoneInfo.ConvertTimeToUtc(dateTime) -
                             new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
              }
    }

কোড সাহায্যকারী ব্যবহার করে:

double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now)

0

সিস্টেমে ডেটটাইমঅফসেটের জন্য একটি টুউনিক্সটাইমমিলিসেকেন্ড রয়েছে

আপনি ডেটটাইমের জন্য অনুরূপ পদ্ধতি লিখতে পারেন:

public static long ToUnixTimeSeconds(this DateTime value)
{
    return value.Ticks / 10000000L - 62135596800L;
}

10000000L - টিক্সকে সেকেন্ডে রূপান্তর করছে

62135596800L - 01.01.01 থেকে 01.01.1978 এ রূপান্তর করা

ইউটিসি এবং ফাঁস নিয়ে কোনও সমস্যা নেই



0

নীচে একটি 2-উপায় এক্সটেনশন ক্লাস রয়েছে যা সমর্থন করে:

  • টাইমজোন স্থানীয়করণ
  • ইনপুট seconds আউটপুট সেকেন্ডে বা মিলিসেকেন্ডে।

ওপির ক্ষেত্রে ব্যবহারটি হ'ল:

DateTime.Now.ToUnixtime();

অথবা

DateTime.UtcNow.ToUnixtime();

যদিও প্রত্যক্ষ উত্তর উপস্থিত রয়েছে, আমি বিশ্বাস করি জেনেরিক পদ্ধতির ব্যবহার আরও ভাল। বিশেষত কারণ এটি সম্ভবত এমন একটি প্রকল্পের প্রয়োজন যা এই ধরণের রূপান্তর প্রয়োজন, যেভাবে যাইহোক এই এক্সটেনশানগুলির প্রয়োজন হবে, তাই সবার জন্য একই সরঞ্জামটি ব্যবহার করা আরও ভাল।

    public static class UnixtimeExtensions
    {
        public static readonly DateTime UNIXTIME_ZERO_POINT = new DateTime(1970, 1, 1, 0, 0,0, DateTimeKind.Utc);

        /// <summary>
        /// Converts a Unix timestamp (UTC timezone by definition) into a DateTime object
        /// </summary>
        /// <param name="value">An input of Unix timestamp in seconds or milliseconds format</param>
        /// <param name="localize">should output be localized or remain in UTC timezone?</param>
        /// <param name="isInMilliseconds">Is input in milliseconds or seconds?</param>
        /// <returns></returns>
        public static DateTime FromUnixtime(this long value, bool localize = false, bool isInMilliseconds = true)
        {
            DateTime result;

            if (isInMilliseconds)
            {
                result = UNIXTIME_ZERO_POINT.AddMilliseconds(value);
            }
            else
            {
                result = UNIXTIME_ZERO_POINT.AddSeconds(value);
            }

            if (localize)
                return result.ToLocalTime();
            else
                return result;
        }

        /// <summary>
        /// Converts a DateTime object into a Unix time stamp
        /// </summary>
        /// <param name="value">any DateTime object as input</param>
        /// <param name="isInMilliseconds">Should output be in milliseconds or seconds?</param>
        /// <returns></returns>
        public static long ToUnixtime(this DateTime value, bool isInMilliseconds = true)
        {
            if (isInMilliseconds)
            {
                return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalMilliseconds;
            }
            else
            {
                return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalSeconds;
            }
        }
    }

মিলিসেকেন্ড এবং সেকেন্ডের ফর্ম্যাটগুলিকে বিভ্রান্ত না করার বিষয়ে সতর্কতা অবলম্বন করুন (সেরা কেস ব্যতিক্রম, সবচেয়ে অযৌক্তিক রূপান্তর) আমি ইনপুট-আউটপুটটিকে মিলিসেকেন্ডের ফর্ম্যাটে ডিফল্ট করেছি। আপনি যদি ডিফল্ট হিসাবে সেকেন্ডের বিন্যাসটি ব্যবহার করতে পছন্দ করেন তবে কেবল isInMilliseconds = true (উভয় পদ্ধতিতে) মিথ্যাতে স্যুইচ করুন।
সিঙ্গেলফ্লেক

0

আমি কিছুক্ষণ সংগ্রাম করার পরে এটি ব্যবহার করেছি, এটি টাইমজোন অফসেটটিও সরবরাহ করে:

    public double Convert_DatTime_To_UNIXDATETIME(DateTime dt)
    {
        System.DateTime from_date = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
        double unix_time_since = dt.Subtract(from_date).TotalMilliseconds;

        TimeSpan ts_offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

        double offset = ts_offset.TotalMilliseconds;

        return unix_time_since - offset;
    }

-1

আমি যে সাধারণ কোডটি ব্যবহার করছি:

public static long CurrentTimestamp()
{
   return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds * 1000);
}

এই কোডটি ইউনিক্স টাইমস্ট্যাম্প দিচ্ছে, 1970-01-01 থেকে এখন পর্যন্ত মোট মিলিসেকেন্ড ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.