web-dev-qa-db-fra.com

Comment convertir une date/heure en horodatage à l'aide de C # /. NET (en ignorant le fuseau horaire actuel)

Comment convertir une date et une heure en timestamp avec C # .NET (en ignorant le fuseau horaire actuel)?

J'utilise le code ci-dessous:

private long ConvertToTimestamp(DateTime value)
{
    long Epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
    return Epoch;
}

Mais il renvoie la valeur d'horodatage en fonction du fuseau horaire actuel et j'ai besoin du résultat sans utiliser le fuseau horaire actuel.

21
User

En ce moment, vous appelez ToUniversalTime() - il suffit de vous en débarrasser:

private long ConvertToTimestamp(DateTime value)
{
    long Epoch = (value.Ticks - 621355968000000000) / 10000000;
    return Epoch;
}

Alternativement, et un peu plus lisiblement, IMO:

private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
...

private static long ConvertToTimestamp(DateTime value)
{
    TimeSpan elapsedTime = value - Epoch;
    return (long) elapsedTime.TotalSeconds;
}

EDIT: Comme indiqué dans les commentaires, la Kind de la DateTime que vous transmettez n'est pas prise en compte lorsque vous effectuez une soustraction. Vous devriez vraiment passer une valeur avec une Kind de Utc pour que cela fonctionne. Malheureusement, DateTime est un peu cassé à cet égard - voir my blog post (un discours sur DateTime) pour plus de détails.

Vous voudrez peut-être utiliser plutôt mon API de date/heure Noda Time , ce qui rendra tout plus clair, IMO.

46
Jon Skeet

Je ne sais pas exactement ce que tu veux. Voulez-vous un TimeStamp? Ensuite, vous pouvez faire quelque chose de simple comme:

TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks);

Puisque vous avez nommé une variable Epoch, voulez-vous l'équivalent en temps Unix de votre date?

DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc);
long Epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds);
6
Jensen

Trouver un horodatage à partir de DateTime:

private long ConvertToTimestamp(DateTime value)
{
    TimeZoneInfo NYTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime NyTime = TimeZoneInfo.ConvertTime(value, NYTimeZone);
    TimeZone localZone = TimeZone.CurrentTimeZone;
    System.Globalization.DaylightTime dst = localZone.GetDaylightChanges(NyTime.Year);
    NyTime = NyTime.AddHours(-1);
    DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (NyTime - Epoch);
    return (long)Convert.ToDouble(span.TotalSeconds);
}
1
Vivekveer

JonSkeet a une bonne réponse, mais si vous souhaitez garder le résultat plus portable, vous pouvez convertir la date au format ISO 8601 qui pourrait ensuite être lu dans la plupart des autres cadres, mais cela pourrait ne pas correspondre à vos besoins.

value.ToUniversalTime().ToString("O");
0
Bronumski