Unix 时间戳函数未返回预期的时间戳,时区错误?

Unix timestamp function not returning expected timestamp, wrong timezone?

我正在使用一个自定义函数获取当前日期并减去天数,然后 return 一个 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;
}

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

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

您有一个单独的问题,它多次调用 DateTime.UtcNow - 两次调用之间的日期可能会发生变化。最好使用 DateTime.UtcNow.Date 来获取 "today-in-UTC date".

这是更好的代码:

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

重要的是,DateTime.UtcNow.Date.AddDays(-days)Kind 仍将是 DateTimeKind.Utc