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

关于可能导致这种情况的任何想法或反馈都会很棒,谢谢!

你在没有指定Kind的情况下调用DateTime构造函数,然后你调用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);

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

最新更新