it-swarm.dev

كيفية الحصول على الطابع الزمني يونيكس في C #

لقد ألقيت نظرة حول stackoverflow ، وحتى نظرت في بعض الأسئلة المقترحة ولا يبدو أن هناك إجابة ، كيف يمكنك الحصول على طابع زمني يونيكس في C #؟

314
bizzehdee

يمكنك الحصول على طابع زمني يونيكس في C # باستخدام DateTime.UtcNow وطرح وقت epoc من 1970-01-01.

مثلا.

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

يمكن استبدال DateTime.Now بأي كائن DateTime ترغب في الحصول على الطابع الزمني لـ unix لـ.

506
bizzehdee

اعتبارًا من .NET 4.6 ، يوجد DateTimeOffset.ToUnixTimeSeconds() .


هذه طريقة مثيل ، لذلك يُتوقع منك الاتصال بها على مثيل DateTimeOffset. يمكنك أيضًا إلقاء أي مثيل لـ DateTime ، على الرغم من احذر المنطقة الزمنية .

للحصول على الطابع الزمني الحالي:

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

للحصول على الطابع الزمني من DateTime:

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

يمكنك أيضا استخدام القراد. أقوم بترميز Windows Mobile لذلك لا تملك المجموعة الكاملة من الطرق. TotalSeconds غير متوفر لي.

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;
37
Dave Hindle

هذا هو ما أستخدمه:

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

ضع في اعتبارك أن هذه الطريقة ستعود بالوقت كـ "التوقيت العالمي المنسق" (UTC).

24
Bartłomiej Mucha

يعد اقتطاع .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);
}
18
Brad

عندما تطرح عام 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.
6
Kelly Anderson

هذا هو ما أستخدمه.

 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;
        }
}
5
Matthew James Lewis

ساعد هذا الحل في وضعي:

   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)
2
Aslan Kystaubayev

لقد قمت بتنسيق الطرق الأكثر أناقة لهذه الطريقة المساعدة:

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
XDS