Closed
Description
Version
v16.15.1
Platform
Linux localhost.localdomain 4.18.0-394.el8.x86_64 #1 SMP Tue May 31 16:19:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
File system
What steps will reproduce the bug?
- create a file with minus epoch time.
$ touch --date=@-1 hogehoge
$ ls --full-time hogehoge
-rw-rw-r--. 1 kusanagi kusanagi 0 1969-12-31 23:59:59.000000000 +0000 hogehoge
- run the following code to test
fs.statSync
andfs.promises.stat
for file hogehoge.
import { stat } from 'fs/promises';
import { statSync } from 'fs';
async function test() {
const stats = await stat('hogehoge');
console.log({stats});
console.log(stats.mtime);
console.log(stats.mtime.getTime());
}
function testSync() {
const stats = statSync('hogehoge');
console.log({stats});
console.log(stats.mtime);
console.log(stats.mtime.getTime());
}
await test();
testSync();
{
stats: Stats {
dev: 64768,
mode: 33204,
nlink: 1,
uid: 1000,
gid: 1000,
rdev: 0,
blksize: 4096,
ino: 56395369,
size: 0,
blocks: 0,
atimeMs: 1.8446744073709552e+22,
mtimeMs: 1.8446744073709552e+22,
ctimeMs: 1657161984281.557,
birthtimeMs: 1657161921560.5312,
atime: Invalid Date,
mtime: Invalid Date,
ctime: 2022-07-07T02:46:24.282Z,
birthtime: 2022-07-07T02:45:21.561Z
}
}
Invalid Date
NaN
{
stats: Stats {
dev: 64768,
mode: 33204,
nlink: 1,
uid: 1000,
gid: 1000,
rdev: 0,
blksize: 4096,
ino: 56395369,
size: 0,
blocks: 0,
atimeMs: 1.8446744073709552e+22,
mtimeMs: 1.8446744073709552e+22,
ctimeMs: 1657161984281.557,
birthtimeMs: 1657161921560.5312,
atime: Invalid Date,
mtime: Invalid Date,
ctime: 2022-07-07T02:46:24.282Z,
birthtime: 2022-07-07T02:45:21.561Z
}
}
Invalid Date
NaN
How often does it reproduce? Is there a required condition?
Always.
What is the expected behavior?
ctime/mtime/atime with negative epoch time shall be treated as it is.
In other words, if -1 then it shall be 1 second before epoch.
Actually, Date()
supports negative epoch time.
$ node
Welcome to Node.js v16.15.1.
Type ".help" for more information.
> new Date(-1)
1969-12-31T23:59:59.999Z
>
As stat(2)
supports negative epoch time, which can be observed via ls command, I don't see why fs.stat
/fs.statSync
/fs.promises.stat
treats negative epoch as NaN
.
What do you see instead?
$ touch --date=@-1 hogehoge
$ ls --full-time hogehoge
-rw-rw-r--. 1 kusanagi kusanagi 0 1969-12-31 23:59:59.000000000 +0000 hogehoge
$ cat > test.mjs
import { stat } from 'fs/promises';
import { statSync } from 'fs';
async function test() {
const stats = await stat('hogehoge');
console.log({stats});
console.log(stats.mtime);
console.log(stats.mtime.getTime());
}
function testSync() {
const stats = statSync('hogehoge');
console.log({stats});
console.log(stats.mtime);
console.log(stats.mtime.getTime());
}
await test();
testSync();
$ node test.mjs
{
stats: Stats {
dev: 64768,
mode: 33204,
nlink: 1,
uid: 1000,
gid: 1000,
rdev: 0,
blksize: 4096,
ino: 56395369,
size: 0,
blocks: 0,
atimeMs: 1.8446744073709552e+22,
mtimeMs: 1.8446744073709552e+22,
ctimeMs: 1657161984281.557,
birthtimeMs: 1657161921560.5312,
atime: Invalid Date,
mtime: Invalid Date,
ctime: 2022-07-07T02:46:24.282Z,
birthtime: 2022-07-07T02:45:21.561Z
}
}
Invalid Date
NaN
{
stats: Stats {
dev: 64768,
mode: 33204,
nlink: 1,
uid: 1000,
gid: 1000,
rdev: 0,
blksize: 4096,
ino: 56395369,
size: 0,
blocks: 0,
atimeMs: 1.8446744073709552e+22,
mtimeMs: 1.8446744073709552e+22,
ctimeMs: 1657161984281.557,
birthtimeMs: 1657161921560.5312,
atime: Invalid Date,
mtime: Invalid Date,
ctime: 2022-07-07T02:46:24.282Z,
birthtime: 2022-07-07T02:45:21.561Z
}
}
Invalid Date
NaN
Additional information
No response