2017-05-08 70 views
2

我正在使用自定义函数来取当前日期并减去它的日子,然后以unix格式返回一个时间戳。除预期输出不正确之外,所有转换都正常工作。我想通过设置Unix时间戳函数没有返回预期的时间戳,错误的时区?

日期时间(DateTime.UtcNow.Year,DateTime.UtcNow.Month,DateTime.UtcNow.Day,0,0,0)

0,0,0,它将给我午夜的一天,但它给了我5am(GMT)。

我的自定义函数:

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

是不是Unix时间戳_seconds_自时代以来,而不是几天? – silkfire

+0

@silkfire这应该不重要我不会想,我将日期时间转换为unix时间戳。 –

+0

对不起,错过了那部分。你有没有试过.NET v4.6中提供的'DateTimeOffset.ToUnixTimeSeconds'方法? – silkfire

回答

3

你调用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); 

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

+1

感谢您的明确解释!将接受何时可用。 –