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