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

时间:2012-03-21 22:56:14

标签: c# asp.net timezone

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

我使用以下代码:

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

但是它会根据当前时区返回时间戳值&我需要结果而不使用当前时区。

4 个答案:

答案 0 :(得分:52)

当你打电话给ToUniversalTime()时 - 只是摆脱它:

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

或者,更可读的是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;
}

编辑:如评论中所述,当您执行减法时,不会考虑传入的Kind DateTime。您应该传递一个Kind Utc的值来实现此功能。不幸的是,DateTime在这方面有点突破 - 请参阅my blog post(关于DateTime的咆哮)以获取更多详情。

您可能希望使用我的Noda Time日期/时间API,这样可以使所有内容更加清晰,IMO。

答案 1 :(得分:6)

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

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

由于您命名了一个变量纪元,您希望Unix时间等同于您的日期吗?

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

JonSkeet有一个很好的答案,但作为一种替代方案,如果您希望保持结果更具可移植性,您可以将日期转换为ISO 8601格式,然后可以将其读入大多数其他框架,但这可能超出您的要求

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