How do you convert epoch time in C#?

后端 未结 14 2305
野的像风
野的像风 2020-11-22 06:51

How do you convert Unix epoch time into real time in C#? (Epoch beginning 1/1/1970)

相关标签:
14条回答
  • 2020-11-22 07:12

    If you want better performance you can use this version.

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

    From a quick benchmark (BenchmarkDotNet) under net471 I get this number:

            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 faster against LukeH's version (if the performance mater)

    This is similar to how DateTime internally work.

    0 讨论(0)
  • 2020-11-22 07:12

    If you are not using 4.6, this may help Source: 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;
        }    
    
    0 讨论(0)
  • 2020-11-22 07:13

    currently you can simply use

    DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
    

    it will be returned as a 64-bits long

    0 讨论(0)
  • 2020-11-22 07:13

    Here is my solution:

    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);
    }
    
    0 讨论(0)
  • 2020-11-22 07:16

    Use the method DateTimeOffset.ToUnixTimeMilliseconds() It returns the number of milliseconds that have elapsed since 1970-01-01T00:00:00.000Z.

    This is only supported with Framework 4.6 or higher

    var EPOCH = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
    

    It's well documented here DateTimeOffset.ToUnixTimeMilliseconds

    The other way out is to use the following

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

    To get the EPOCH with seconds only you may use

     var Epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
    

    and convert the Epoch to DateTime with the following method

    private DateTime Epoch2UTCNow(int epoch) 
    {
        return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epoch); 
    }
    
    0 讨论(0)
  • 2020-11-22 07:19

    The latest version of .Net (v4.6) just added built-in support for Unix time conversions. That includes both to and from Unix time represented by either seconds or milliseconds.

    • Unix time in seconds to DateTimeOffset:

    DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
    
    • DateTimeOffset to Unix time in seconds:

    long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
    
    • Unix time in milliseconds to DateTimeOffset:

    DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
    
    • DateTimeOffset to Unix time in milliseconds:

    long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();
    

    Note: These methods convert to and from DateTimeOffset. To get a DateTime representation simply use the DateTimeOffset.DateTime property:

    DateTime dateTime = dateTimeOffset.UtcDateTime;
    
    0 讨论(0)
提交回复
热议问题