2017-04-24 53 views
0

我在那裏我正在與溫斯頓旋轉所產生的日誌文件Linux服務器,所以filename有文件名和創建日期,所以你可以看到第一個文件中dataserver20170414181405.log創建了2017-04-14但使用fs.stats.birthtime其給予FILEDATE Apr-19-2017。我如何獲得準確的文件創建日期在Linux上工作?如何使用fs模塊獲取文件創建日期?

cron.js

fs.stat(filePath, function (err, stats) { 
    if (err) return cb2(err); 
    var fileInfo = { fileDate: stats.birthtime, filename: file }; 
    console.log(fileInfo); 
}); 

數據

{ fileDate: Wed Apr 19 2017 00:51:56 GMT-0400 (EDT), 
    filename: 'server20170414181405.log' }, 
    { fileDate: Wed Apr 19 2017 00:52:04 GMT-0400 (EDT), 
    filename: 'server20170414212655.log' }, 
    { fileDate: Wed Apr 19 2017 00:52:07 GMT-0400 (EDT), 
    filename: 'server20170415023845.log' }, 

回答

0

的stat.birthtime是文件創建的服務器時區的真實日期。可能是因爲Winston和你的服務器在不同的時區工作而產生差異。

如果不是這樣來對齊兩個時區,並且您需要某個特定時區中的stat.birthtime,則可以使用moment-timezone日期構造函數。

+1

他使用的日期相隔5天。這是一個很大的時區差異! :) –

0

獲取真正的文件創建時間一直很困難。 Linux內核最近纔開始支持它,所以我不知道這個值是多麼準確。它可能取決於您使用的Linux版本。有一些背景在這個崗位:

https://unix.stackexchange.com/questions/304779/is-there-still-no-linux-kernel-interface-to-get-file-creation-date

但是,您要添加的創建時間到文件名。爲什麼不分析文件名並創建一個Date對象,而不是使用fs.stat()

const filename = 'server20170414181405.log'; 
const dateString = filename.substr(6, 4) + '-' + filename.substr(10, 2) 
    + '-' + filename.substr(12, 2) + 'T' + filename.substr(14, 2) 
    + ':' + filename.substr(16, 2) + ':' + filename.substr(18, 2); 

// '2017-04-14T18:14:05'  
const createDate = new Date(dateString); 

您可以添加Z到年底UTC或正確的時區偏移,不管是什麼時區您正在使用的文件名。當然,這假定您的文件名是準確的,但是,如果是這樣,它似乎比使用fs.stat()更容易且更快。

- 編輯 -

看起來你已經擁有的路徑在filePath變量的文件,這樣你就可以使用path.basename()方法獲取文件名:

const path = require('path'); 

const filename = path.basename(filePath); 

請參閱Node文檔:https://nodejs.org/dist/latest-v6.x/docs/api/path.html#path_path_basename_path_ext。獲得文件名後,您可以使用原始文章中的代碼獲取日期。

+0

我想了解你是如何解析日期而不使用文件名變量 – hussain

+0

@hussain我不知道我明白你在問什麼。我編輯了我的帖子。請看看是否有幫助。 –

+0

你沒有使用'filename'變量來解析日期,當你執行's.substr(6,4)'時,會發生什麼?'它將如何從文件名得到日期? – hussain

相關問題