2017-05-08 69 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

感謝您的明確解釋!將接受何時可用。 –