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 #?
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.
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();
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;
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).
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);
}
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.
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;
}
}
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)
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;
}
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.