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