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