簡體   English   中英

將紀元時間戳轉換為DateTime

[英]Converting Epoch timestamp to DateTime

您好,我遇到一個奇怪的問題,我的情況是,我正在使用c#語言讀取存儲在sqlite數據庫中的Google Chrome瀏覽器的歷史記錄。 除了chrome以時代格式存儲的時間戳之外,一切都正常,我必須使用php將數據上傳到服務器,並將其存儲在MYSQL數據庫中。 現在我的問題是我無法將那個時代的時間戳轉換為基於MYSQL的日期時間。 對於C#我嘗試了以下代碼

public static DateTime FromUnixTime(long unixTime)
{
    return epoch.AddSeconds(unixTime);
}

這里獲取,我嘗試了該鏈接上的所有可用解決方案,但在我的情況下它們沒有起作用。

對於PHP,我嘗試了下面的代碼從這里獲取

echo date("Y-m-d H:i:s", substr($epoch, 0, 10));

但是如果時間戳與示例中提到的時間戳相同,則轉換正確,但使用我的紀元時間戳執行時返回錯誤的年份。

我甚至試過在MySQL查詢級別來解決這個問題,所以我搜查,試圖從采取了以下解決方案在這里

select from_unixtime(floor(1389422614485/1000));

當我不替換示例時代時間戳時,它確實起作用,但是當我放自己的時間戳時,它不起作用

請幫助我擺脫這個奇怪的煩人的問題,無論您在哪一層提供解決方案都可以,以下語言是首選

  1. C#
  2. PHP
  3. MYSQL查詢

示例時代時間戳記正在消失

13209562668824233

我確實知道,就長度而言,它與示例中的不一樣,但是請注意,chrome確實可以有效地進行轉換。

PHP(64位,無毫秒)的解決方案是

$ts = 13209562668824233;

$date = date_create("1601-1-1 UTC")
  ->modify((int)($ts/1000000)." Seconds")
  ->format('Y-m-d H:i:s')
;  //"2019-08-06 10:57:48"

有關更多詳細信息,請參閱: Chrome時間戳的格式是什么?

如此答案所解釋,Chrome時間戳記不等於Unix紀元時間。 這就是為什么您無法從此類方法獲得預期結果的原因。 實際上,這是自1601年1月1日以來的微秒(與1970年1月1日以來的Unix紀元的秒數​​相反)。

您可以在此處測試WebKit時間戳,在那里您將看到它返回2019年8月6日星期二10:57:48(UTC)。

因此,要在代碼中進行轉換,我們應該首先減去1970與1601之間的差(以微秒為單位),然后將該值除以100萬以得到秒(C#解決方案):

public static DateTime ConvertWebKitTime(long webkitEpoch)
{
    const long epochDifferenceMicroseconds = 11644473600000000; // difference in microseconds between 1601 and 1970
    var epoch = (webkitEpoch - epochDifferenceMicroseconds) / 1000000; // adjust to seconds since 1st Jan 1970
    return DateTimeOffset.FromUnixTimeSeconds(epoch).UtcDateTime; // convert to datetime
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM