我使用自定义函数获取当前日期并在其上减去天数,然后以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;
}
任何有关可能导致此问题的想法或反馈都会很棒,谢谢!
答案 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)
。