web-dev-qa-db-fra.com

Comment obtenir le timestamp unix en C #

J'ai regardé autour de stackoverflow, et j'ai même regardé certaines des questions suggérées et aucune ne semble répondre, comment obtenez-vous un timestamp Unix en C #?

339
bizzehdee

Vous obtenez un horodatage Unix en C # en utilisant DateTime.UtcNow et en soustrayant l’époc de l’époque du 1970-01-01.

par exemple.

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

DateTime.UtcNow peut être remplacé par n'importe quel objet DateTime pour lequel vous souhaitez obtenir l'horodatage Unix.

532
bizzehdee

Depuis .NET 4.6, il y a DateTimeOffset.ToUnixTimeSeconds() .


Ceci est une méthode d'instance, vous devez donc l'appeler sur une instance de DateTimeOffset. Vous pouvez également convertir n'importe quelle instance de DateTime, bien que attention au fuseau horaire .

Pour obtenir l'horodatage actuel:

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

Pour obtenir l'horodatage d'un DateTime:

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

Vous pouvez également utiliser les tiques. Je code pour Windows Mobile, donc n’avez pas l’ensemble des méthodes. TotalSeconds n'est pas disponible pour moi.

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

ou

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

C'est ce que j'utilise:

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

Gardez à l'esprit que cette méthode renverra l'heure sous forme de temps universel coordonné (UTC).

25
Bartłomiej Mucha

Tronquer .TotalSeconds est important car défini comme the value of the current System.TimeSpan structure expressed in whole fractional seconds.

Et que diriez-vous d'une extension pour DateTime? La seconde est probablement plus source de confusion que cela vaut la peine d’exister jusqu’à ce que des extensions de propriété existent.

/// <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);
}
19
Brad

Lorsque vous soustrayez 1970 à l'heure actuelle, sachez que l'intervalle de temps aura le plus souvent un champ différent de zéro milliseconde. Si, pour une raison quelconque, les millisecondes vous intéressent, gardez cela à l'esprit.

Voici ce que j'ai fait pour contourner ce problème.

 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

C'est ce que j'utilise.

 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

Cette solution a aidé dans ma situation:

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

en utilisant helper dans le code:

double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now)
2
Aslan Kystaubayev

J'ai réuni les approches les plus élégantes de cette méthode utilitaire:

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

Le code simple que j'utilise:

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

Ce code donne l'horodatage unix, le nombre total de millisecondes entre 1970-01-01 et maintenant.

0
Erkin Eren