Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to get last modification time of a file with epoch time format, precision millisecond

Tags:

linux

how to get last modification time of a file with epoch time format, precision millisecond on linux system

I tried stat, but it can only show epoch time in seconds are there any simple ways to get epoch time in millisecond

like image 579
wenzi Avatar asked Nov 14 '12 16:11

wenzi


1 Answers

If you're on a filesystem that supports sub-second precision (for example ext4 supports it, ext3 does not), then you can get nanosecond precision through the st_atim.tv_nsec, st_ctim.tv_nsec and st_mtim.tv_nsec fields of struct stat. The values represent the amount of nanoseconds in addition to the amount of seconds in st_atime and friends. For example, you can get millisecond timestamps with:

struct stat info;
stat("/etc", &info);
uint64_t access_ms       = info.st_atime * 1000 + info.st_atim.tv_nsec / 1000000;
uint64_t status_ms       = info.st_ctime * 1000 + info.st_ctim.tv_nsec / 1000000;
uint64_t modification_ms = info.st_mtime * 1000 + info.st_mtim.tv_nsec / 1000000;

A second has 1000ms, so you multiply by that. A millisecond has 1000000ns, so you divide by that.

If the filesystem does not support sub-second precision, then the tv_nsec fields will always be 0. This ensures that the same code will also work on filesystems that don't support sub-second precision.

Note that the amount of milliseconds since epoch can't be stored in a 32-bit value. You need at least 64 bits. uint64_t is provided by <stdint.h>. Alternatively, you can use unsigned long long.

like image 64
Nikos C. Avatar answered Sep 27 '22 03:09

Nikos C.