diff --git a/lib/fs.js b/lib/fs.js index c50788a03d..e9e76a9cff 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -206,6 +206,8 @@ fs.Stats = Stats; // defining the properties in this fashion (explicitly with no loop or factory) // has been shown to be the most performant on V8 contemp. // Ref: https://github.com/nodejs/node/pull/12818 +// + 0.5 is added to the Dates to protect values from being rounded down +// Ref: https://github.com/nodejs/node/pull/12607 Object.defineProperties(Stats.prototype, { atime: { configurable: true, diff --git a/src/node_file.cc b/src/node_file.cc index c0343fbf00..6d07a06259 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -479,9 +479,9 @@ void FillStatsArray(double* fields, const uv_stat_t* s) { fields[9] = -1; #endif // Dates. -#define X(idx, name) \ - fields[idx] = (static_cast(s->st_##name.tv_sec) * 1000) + \ - (static_cast(s->st_##name.tv_nsec / 1000000)); \ +#define X(idx, name) \ + fields[idx] = (s->st_##name.tv_sec * 1e3) + \ + (s->st_##name.tv_nsec / 1e6); \ X(10, atim) X(11, mtim) diff --git a/test/parallel/test-fs-utimes.js b/test/parallel/test-fs-utimes.js index 456f09b804..f5eaf282f5 100644 --- a/test/parallel/test-fs-utimes.js +++ b/test/parallel/test-fs-utimes.js @@ -143,15 +143,21 @@ function testIt(atime, mtime, callback) { const stats = fs.statSync(__filename); // run tests -const runTest = common.mustCall(testIt, 5); +const runTest = common.mustCall(testIt, 6); runTest(new Date('1982-09-10 13:37'), new Date('1982-09-10 13:37'), function() { runTest(new Date(), new Date(), function() { runTest(123456.789, 123456.789, function() { runTest(stats.mtime, stats.mtime, function() { - runTest('123456', -1, common.mustCall(function() { - // done - })); + runTest('123456', -1, function() { + runTest( + new Date('2017-04-08T17:59:38.008Z'), + new Date('2017-04-08T17:59:38.008Z'), + common.mustCall(function() { + // done + }) + ); + }); }); }); });