2017-04-24 259 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