Jak uzyskać znacznik czasu unix w C#

Rozglądałem się po stackoverflow, a nawet przejrzałem niektóre z sugerowanych pytań i żaden z nich nie odpowiada, jak uzyskać uniksowy znacznik czasu w C#?

Author: bizzehdee, 2013-07-13

9 answers

Otrzymujesz uniksowy znacznik czasu w C# używając DateTime.UtcNow i odejmowanie czasu epoc z dnia 1970-01-01.

Np.

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

DateTime.Now może być zastąpiony dowolnym obiektem DateTime, dla którego chcesz uzyskać znacznik czasu Uniksa.

 446
Author: bizzehdee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-14 20:02:57

Od. NET 4.6 istnieje DateTimeOffset.ToUnixTimeSeconds().


Jest to metoda instancji, więc należy ją wywołać na instancji DateTimeOffset. Możesz również rzucić dowolną instancję DateTime, chociaż uważaj na strefę czasową.

Aby pobrać bieżący znacznik czasu:

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

Aby pobrać znacznik czasu z DateTime:

DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();
 286
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-05 15:36:55

Można również użyć kleszczy. Koduję Dla Windows Mobile, więc nie mam pełnego zestawu metod. TotalSeconds nie jest dostępna dla mnie.

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

Lub

TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = unixTicks.TotalSeconds;
 34
Author: Dave Hindle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 19:32:54

Tego używam:

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

Należy pamiętać, że ta metoda zwróci czas jako skoordynowany Czas uniwersalny (UTC).

 21
Author: Bartłomiej Mucha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 22:16:16

Obcinanie {[1] } jest ważne, ponieważ jest zdefiniowane jako the value of the current System.TimeSpan structure expressed in whole fractional seconds.

A może rozszerzenie dla DateTime? Drugi jest prawdopodobnie bardziej mylący, że warto, dopóki nie istnieją rozszerzenia właściwości.

/// <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);
}
 16
Author: Brad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 17:29:42

Po odjęciu 1970 od bieżącego czasu, należy pamiętać, że timespan najczęściej będzie miał niezerowe pole milisekund. Jeśli z jakiegoś powodu interesują Cię milisekundy, pamiętaj o tym.

Oto, co zrobiłem, aby obejść ten problem.
 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
Author: Kelly Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 19:35:11

Tego właśnie używam.

 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
Author: Matthew James Lewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-14 04:49:18

To rozwiązanie pomogło w mojej sytuacji:

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

Użycie helpera w kodzie:

double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now)
 2
Author: Aslan Kystaubayev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 19:59:58

Połączyłem ze sobą najbardziej eleganckie podejście do tej metody użytkowej:

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
Author: xDisruptor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 11:37:01