如何使用C#/ .NET将日期时间转换为时间戳(忽略当前时区)

Use*_*ser 25 c# asp.net timezone

如何使用C#.NET将日期时间转换为时间戳(忽略当前时区)?

我使用以下代码:

private long ConvertToTimestamp(DateTime value)
{
    long epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
    return epoch;
}
Run Code Online (Sandbox Code Playgroud)

但是它根据当前时区返回时间戳值,并且我需要结果而不使用当前时区.

Jon*_*eet 56

在你打电话的那一刻ToUniversalTime()- 只是摆脱它:

private long ConvertToTimestamp(DateTime value)
{
    long epoch = (value.Ticks - 621355968000000000) / 10000000;
    return epoch;
}
Run Code Online (Sandbox Code Playgroud)

或者,更可读的是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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述Kind,DateTime执行减法时不会考虑传入的内容.你应该真的传入一个值Kind,Utc并为此工作.不幸的是,DateTime在这方面有点不妥- 请参阅我的博客文章(咆哮DateTime)以获取更多细节.

您可能希望使用我的Noda Time日期/时间API,这使得一切都相当清晰,IMO.

  • @ArashMilani - 您可能可以调整上面的代码以使用`Local`种类,但是没有办法使它与`Unspecified`类型一起工作,因为它不知道它与UTC的关系.而且,因为`Local`只来自`DateTime.Now`,你可以在那里使用`DateTime.UtcNow`,那么除了`Utc`以外的其他类型实际上没有任何好处.我可以证明NodaTime是一个更好的解决方案.另请参阅[此博客文章](http://codeofmatt.com/2013/04/25/the-case-against-datetime-now/)我写的. (2认同)

Jen*_*sen 6

我不确定你想要的是什么.你想要一个TimeStamp吗?然后你可以做一些简单的事情:

TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks);
Run Code Online (Sandbox Code Playgroud)

既然你命名了一个变量纪元,你想要Unix时间等于你的日期吗?

DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc);
long epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds);
Run Code Online (Sandbox Code Playgroud)