Unix时间戳功能没有返回预期的时间戳,错误的时区?

时间:2017-05-08 17:51:49

标签: c# asp.net datetime unix

我使用自定义函数获取当前日期并在其上减去天数,然后以unix格式返回时间戳。除了预期的输出不正确外,所有转换都正常工作。我想通过设置

  

DateTime(DateTime.UtcNow.Year,DateTime.UtcNow.Month,DateTime.UtcNow.Day,0,0,0)

0,0,0它会在午夜给我这一天,但它会给我凌晨5点(格林尼治标准时间)。

我的自定义功能:

public static int getUnixTimestamp(int days) {
    // Date to convert
    DateTime dateTime = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0).AddDays(-days);

    return (int)(TimeZoneInfo.ConvertTimeToUtc(dateTime) -
           new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
}

任何有关可能导致此问题的想法或反馈都会很棒,谢谢!

1 个答案:

答案 0 :(得分:4)

您在没有指定DateTime的情况下调用Kind构造函数,然后您正在调用ConvertTimeToUtc。这将假设 dateTime实际上是本地的,并将其转换为UTC。鉴于您已经使用UTC值构建它,您无需转换它。

您有一个单独的问题,即多次调用DateTime.UtcNow - 日期可能会在这些调用之间发生变化。最好使用DateTime.UtcNow.Date来获取“今天的UTC日期”。

这是更好的代码:

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

// TODO: Give this a clearer name
public static int GetUnixTimestamp(int days)
    => (int) ((DateTime.UtcNow.Date.AddDays(-days) - UnixEpoch).TotalSeconds);

重要的是,Kind的{​​{1}}仍为DateTime.UtcNow.Date.AddDays(-days)