pub struct FileTime(/* private fields */);
Expand description
FileTime
is a type that represents a Windows file time.
This is a 64-bit unsigned integer value that represents the number of 100-nanosecond intervals that have elapsed since “1601-01-01 00:00:00 UTC”, and is used as timestamps such as NTFS and 7z.
This represents the same value as the FILETIME
structure of the Win32
API, which represents a 64-bit unsigned integer value. Note that the
maximum value of the FILETIME
structure that can be input to the
FileTimeToSystemTime
function of the Win32 API is limited to
“+30828-09-14 02:48:05.477580700 UTC”, which is equivalent to i64::MAX
.
Implementations§
Source§impl FileTime
impl FileTime
Sourcepub const NT_TIME_EPOCH: FileTime
pub const NT_TIME_EPOCH: FileTime
The NT time epoch.
This is defined as “1601-01-01 00:00:00 UTC”.
§Examples
assert_eq!(FileTime::NT_TIME_EPOCH, datetime!(1601-01-01 00:00 UTC));
Sourcepub const UNIX_EPOCH: FileTime
pub const UNIX_EPOCH: FileTime
The Unix epoch.
This is defined as “1970-01-01 00:00:00 UTC”.
§Examples
assert_eq!(FileTime::UNIX_EPOCH, OffsetDateTime::UNIX_EPOCH);
Source§impl FileTime
impl FileTime
Sourcepub fn to_dos_date_time(
self,
offset: Option<UtcOffset>,
) -> Result<(u16, u16, u8, Option<UtcOffset>), DosDateTimeRangeError>
pub fn to_dos_date_time( self, offset: Option<UtcOffset>, ) -> Result<(u16, u16, u8, Option<UtcOffset>), DosDateTimeRangeError>
Returns MS-DOS date and time which represents the same date and time
as this FileTime
. This date and time is used as the timestamp such as
FAT, exFAT or ZIP file format.
This method returns a (date, time, resolution, offset)
tuple.
date
and time
represents the local date and time. This date and time
has no notion of time zone. The resolution of MS-DOS date and time is 2
seconds, but additional finer resolution (10 ms units) can be
provided. resolution
represents this additional finer resolution.
When the offset
parameter is Some
, converts date
and time
from
UTC to the local date and time in the provided time zone and returns it
with the UTC offset. When the offset
parameter is None
or is not
a multiple of 15 minute intervals, returns the UTC date and time as a
date and time and None
as the UTC offset.
§Errors
Returns Err
if the resulting date and time is out of range for
MS-DOS date and time.
§Panics
Panics if offset
is not in the range “UTC-16:00” to
“UTC+15:45”.1
§Examples
// `1980-01-01 00:00:00 UTC`.
assert_eq!(
FileTime::new(119_600_064_000_000_000)
.to_dos_date_time(None)
.unwrap(),
(0x0021, u16::MIN, u8::MIN, None)
);
// `2107-12-31 23:59:59 UTC`.
assert_eq!(
FileTime::new(159_992_927_990_000_000)
.to_dos_date_time(None)
.unwrap(),
(0xff9f, 0xbf7d, 100, None)
);
// Before `1980-01-01 00:00:00 UTC`.
assert!(FileTime::new(119_600_063_990_000_000)
.to_dos_date_time(None)
.is_err());
// After `2107-12-31 23:59:59.990000000 UTC`.
assert!(FileTime::new(159_992_928_000_000_000)
.to_dos_date_time(None)
.is_err());
// From `2002-11-27 03:25:00 UTC` to `2002-11-26 19:25:00 -08:00`.
assert_eq!(
FileTime::new(126_828_411_000_000_000)
.to_dos_date_time(Some(offset!(-08:00)))
.unwrap(),
(0x2d7a, 0x9b20, u8::MIN, Some(offset!(-08:00)))
);
When the UTC offset is not a multiple of 15 minute intervals, returns the UTC date and time:
// `2002-11-27 03:25:00 UTC`.
assert_eq!(
FileTime::new(126_828_411_000_000_000)
.to_dos_date_time(Some(offset!(-08:01)))
.unwrap(),
(0x2d7b, 0x1b20, u8::MIN, None)
);
// `2002-11-27 03:25:00 UTC`.
assert_eq!(
FileTime::new(126_828_411_000_000_000)
.to_dos_date_time(Some(offset!(-08:14)))
.unwrap(),
(0x2d7b, 0x1b20, u8::MIN, None)
);
// From `2002-11-27 03:25:00 UTC` to `2002-11-26 19:10:00 -08:15`.
assert_eq!(
FileTime::new(126_828_411_000_000_000)
.to_dos_date_time(Some(offset!(-08:15)))
.unwrap(),
(0x2d7a, 0x9940, u8::MIN, Some(offset!(-08:15)))
);
Sourcepub fn from_dos_date_time(
date: u16,
time: u16,
resolution: Option<u8>,
offset: Option<UtcOffset>,
) -> Result<FileTime, ComponentRange>
pub fn from_dos_date_time( date: u16, time: u16, resolution: Option<u8>, offset: Option<UtcOffset>, ) -> Result<FileTime, ComponentRange>
Creates a FileTime
with the given MS-DOS date and time. This date
and time is used as the timestamp such as FAT, exFAT or ZIP file
format.
When resolution
is Some
, additional finer resolution (10 ms
units) is added to time
.
When offset
is Some
, converts date
and time
from the local
date and time in the provided time zone to UTC. When offset
is
None
or is not a multiple of 15 minute intervals, assumes the
provided date and time is in UTC.
§Errors
Returns Err
if date
or time
is an invalid date and time.
§Panics
Panics if any of the following are true:
resolution
is greater than 199.offset
is not in the range “UTC-16:00” to “UTC+15:45”.1
§Examples
// `1980-01-01 00:00:00 UTC`.
assert_eq!(
FileTime::from_dos_date_time(0x0021, u16::MIN, None, None).unwrap(),
FileTime::new(119_600_064_000_000_000)
);
// `2107-12-31 23:59:59 UTC`.
assert_eq!(
FileTime::from_dos_date_time(0xff9f, 0xbf7d, Some(100), None).unwrap(),
FileTime::new(159_992_927_990_000_000)
);
// From `2002-11-26 19:25:00 -08:00` to `2002-11-27 03:25:00 UTC`.
assert_eq!(
FileTime::from_dos_date_time(0x2d7a, 0x9b20, None, Some(offset!(-08:00))).unwrap(),
FileTime::new(126_828_411_000_000_000)
);
// The Day field is 0.
assert!(FileTime::from_dos_date_time(0x0020, u16::MIN, None, None).is_err());
// The DoubleSeconds field is 30.
assert!(FileTime::from_dos_date_time(0x0021, 0x001e, None, None).is_err());
When the UTC offset is not a multiple of 15 minute intervals, assumes the provided date and time is in UTC:
// From `2002-11-26 19:25:00 -08:01` to `2002-11-26 19:25:00 UTC`.
assert_eq!(
FileTime::from_dos_date_time(0x2d7a, 0x9b20, None, Some(offset!(-08:01))).unwrap(),
FileTime::new(126_828_123_000_000_000)
);
// From `2002-11-26 19:25:00 -08:14` to `2002-11-26 19:25:00 UTC`.
assert_eq!(
FileTime::from_dos_date_time(0x2d7a, 0x9b20, None, Some(offset!(-08:14))).unwrap(),
FileTime::new(126_828_123_000_000_000)
);
// From `2002-11-26 19:25:00 -08:15` to `2002-11-27 03:40:00 UTC`.
assert_eq!(
FileTime::from_dos_date_time(0x2d7a, 0x9b20, None, Some(offset!(-08:15))).unwrap(),
FileTime::new(126_828_420_000_000_000)
);
Additional finer resolution must be in the range 0 to 199:
let _: FileTime = FileTime::from_dos_date_time(0x0021, u16::MIN, Some(200), None).unwrap();
Source§impl FileTime
impl FileTime
Sourcepub fn checked_add(self, rhs: Duration) -> Option<FileTime>
pub fn checked_add(self, rhs: Duration) -> Option<FileTime>
Computes self + rhs
, returning None
if overflow occurred. The part
of rhs
less than 100-nanosecond is truncated.
§Examples
assert_eq!(
FileTime::NT_TIME_EPOCH.checked_add(Duration::from_nanos(1)),
Some(FileTime::NT_TIME_EPOCH)
);
assert_eq!(
FileTime::NT_TIME_EPOCH.checked_add(Duration::from_nanos(100)),
Some(FileTime::new(1))
);
assert_eq!(FileTime::MAX.checked_add(Duration::from_nanos(100)), None);
Sourcepub fn checked_sub(self, rhs: Duration) -> Option<FileTime>
pub fn checked_sub(self, rhs: Duration) -> Option<FileTime>
Computes self - rhs
, returning None
if the result would be
negative or if overflow occurred. The part of rhs
less than
100-nanosecond is truncated.
§Examples
assert_eq!(
FileTime::MAX.checked_sub(Duration::from_nanos(1)),
Some(FileTime::MAX)
);
assert_eq!(
FileTime::MAX.checked_sub(Duration::from_nanos(100)),
Some(FileTime::new(u64::MAX - 1))
);
assert_eq!(
FileTime::NT_TIME_EPOCH.checked_sub(Duration::from_nanos(100)),
None
);
Sourcepub fn saturating_add(self, rhs: Duration) -> FileTime
pub fn saturating_add(self, rhs: Duration) -> FileTime
Computes self + rhs
, returning FileTime::MAX
if overflow occurred.
The part of rhs
less than 100-nanosecond is truncated.
§Examples
assert_eq!(
FileTime::NT_TIME_EPOCH.saturating_add(Duration::from_nanos(1)),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::NT_TIME_EPOCH.saturating_add(Duration::from_nanos(100)),
FileTime::new(1)
);
assert_eq!(
FileTime::MAX.saturating_add(Duration::from_nanos(100)),
FileTime::MAX
);
Sourcepub fn saturating_sub(self, rhs: Duration) -> FileTime
pub fn saturating_sub(self, rhs: Duration) -> FileTime
Computes self - rhs
, returning FileTime::NT_TIME_EPOCH
if the
result would be negative or if overflow occurred. The part of rhs
less
than 100-nanosecond is truncated.
§Examples
assert_eq!(
FileTime::MAX.saturating_sub(Duration::from_nanos(1)),
FileTime::MAX
);
assert_eq!(
FileTime::MAX.saturating_sub(Duration::from_nanos(100)),
FileTime::new(u64::MAX - 1)
);
assert_eq!(
FileTime::NT_TIME_EPOCH.saturating_sub(Duration::from_nanos(100)),
FileTime::NT_TIME_EPOCH
);
Source§impl FileTime
impl FileTime
Sourcepub fn to_unix_time(self) -> i64
pub fn to_unix_time(self) -> i64
Sourcepub fn to_unix_time_nanos(self) -> i128
pub fn to_unix_time_nanos(self) -> i128
Returns Unix time in nanoseconds which represents the same date and
time as this FileTime
.
§Examples
assert_eq!(
FileTime::NT_TIME_EPOCH.to_unix_time_nanos(),
-11_644_473_600_000_000_000
);
assert_eq!(FileTime::UNIX_EPOCH.to_unix_time_nanos(), i128::default());
assert_eq!(
FileTime::MAX.to_unix_time_nanos(),
1_833_029_933_770_955_161_500
);
Sourcepub fn from_unix_time(timestamp: i64) -> Result<FileTime, FileTimeRangeError>
pub fn from_unix_time(timestamp: i64) -> Result<FileTime, FileTimeRangeError>
Creates a FileTime
with the given Unix time.
§Errors
Returns Err
if time
is out of range for the file time.
§Examples
assert_eq!(
FileTime::from_unix_time(-11_644_473_600).unwrap(),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::from_unix_time(i64::default()).unwrap(),
FileTime::UNIX_EPOCH
);
assert_eq!(
FileTime::from_unix_time(1_833_029_933_770).unwrap(),
FileTime::MAX - Duration::from_nanos(955_161_500)
);
// Before `1601-01-01 00:00:00 UTC`.
assert!(FileTime::from_unix_time(-11_644_473_601).is_err());
// After `+60056-05-28 05:36:10.955161500 UTC`.
assert!(FileTime::from_unix_time(1_833_029_933_771).is_err());
Sourcepub fn from_unix_time_nanos(
timestamp: i128,
) -> Result<FileTime, FileTimeRangeError>
pub fn from_unix_time_nanos( timestamp: i128, ) -> Result<FileTime, FileTimeRangeError>
Creates a FileTime
with the given Unix time in nanoseconds.
§Errors
Returns Err
if time
is out of range for the file time.
§Examples
assert_eq!(
FileTime::from_unix_time_nanos(-11_644_473_600_000_000_000).unwrap(),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::from_unix_time_nanos(i128::default()).unwrap(),
FileTime::UNIX_EPOCH
);
assert_eq!(
FileTime::from_unix_time_nanos(1_833_029_933_770_955_161_500).unwrap(),
FileTime::MAX
);
// Before `1601-01-01 00:00:00 UTC`.
assert!(FileTime::from_unix_time_nanos(-11_644_473_600_000_000_100).is_err());
// After `+60056-05-28 05:36:10.955161500 UTC`.
assert!(FileTime::from_unix_time_nanos(1_833_029_933_770_955_161_501).is_err());
Source§impl FileTime
impl FileTime
Sourcepub const fn new(ft: u64) -> FileTime
pub const fn new(ft: u64) -> FileTime
Creates a new FileTime
with the given file time.
§Examples
assert_eq!(FileTime::new(u64::MIN), FileTime::NT_TIME_EPOCH);
assert_eq!(FileTime::new(116_444_736_000_000_000), FileTime::UNIX_EPOCH);
assert_eq!(FileTime::new(u64::MAX), FileTime::MAX);
Sourcepub const fn to_be_bytes(self) -> [u8; 8]
pub const fn to_be_bytes(self) -> [u8; 8]
Returns the memory representation of this FileTime
as a byte array in
big-endian byte order.
§Examples
assert_eq!(FileTime::NT_TIME_EPOCH.to_be_bytes(), [u8::MIN; 8]);
assert_eq!(
FileTime::UNIX_EPOCH.to_be_bytes(),
[0x01, 0x9d, 0xb1, 0xde, 0xd5, 0x3e, 0x80, 0x00]
);
assert_eq!(FileTime::MAX.to_be_bytes(), [u8::MAX; 8]);
Sourcepub const fn to_le_bytes(self) -> [u8; 8]
pub const fn to_le_bytes(self) -> [u8; 8]
Returns the memory representation of this FileTime
as a byte array in
little-endian byte order.
§Examples
assert_eq!(FileTime::NT_TIME_EPOCH.to_le_bytes(), [u8::MIN; 8]);
assert_eq!(
FileTime::UNIX_EPOCH.to_le_bytes(),
[0x00, 0x80, 0x3e, 0xd5, 0xde, 0xb1, 0x9d, 0x01]
);
assert_eq!(FileTime::MAX.to_le_bytes(), [u8::MAX; 8]);
Sourcepub const fn from_be_bytes(bytes: [u8; 8]) -> FileTime
pub const fn from_be_bytes(bytes: [u8; 8]) -> FileTime
Creates a native endian FileTime
value from its representation as a
byte array in big-endian.
§Examples
assert_eq!(
FileTime::from_be_bytes([u8::MIN; 8]),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::from_be_bytes([0x01, 0x9d, 0xb1, 0xde, 0xd5, 0x3e, 0x80, 0x00]),
FileTime::UNIX_EPOCH
);
assert_eq!(FileTime::from_be_bytes([u8::MAX; 8]), FileTime::MAX);
Sourcepub const fn from_le_bytes(bytes: [u8; 8]) -> FileTime
pub const fn from_le_bytes(bytes: [u8; 8]) -> FileTime
Creates a native endian FileTime
value from its representation as a
byte array in little-endian.
§Examples
assert_eq!(
FileTime::from_le_bytes([u8::MIN; 8]),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::from_le_bytes([0x00, 0x80, 0x3e, 0xd5, 0xde, 0xb1, 0x9d, 0x01]),
FileTime::UNIX_EPOCH
);
assert_eq!(FileTime::from_le_bytes([u8::MAX; 8]), FileTime::MAX);
Trait Implementations§
Source§impl AddAssign<Duration> for FileTime
impl AddAssign<Duration> for FileTime
Source§fn add_assign(&mut self, rhs: Duration)
fn add_assign(&mut self, rhs: Duration)
+=
operation. Read moreSource§impl AddAssign<Duration> for FileTime
impl AddAssign<Duration> for FileTime
Source§fn add_assign(&mut self, rhs: Duration)
fn add_assign(&mut self, rhs: Duration)
+=
operation. Read moreSource§impl Binary for FileTime
impl Binary for FileTime
Source§fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Shows the underlying u64
value of this FileTime
.
§Examples
assert_eq!(format!("{:#b}", FileTime::NT_TIME_EPOCH), "0b0");
assert_eq!(
format!("{:064b}", FileTime::UNIX_EPOCH),
"0000000110011101101100011101111011010101001111101000000000000000"
);
assert_eq!(
format!("{:b}", FileTime::MAX),
"1111111111111111111111111111111111111111111111111111111111111111"
);
Source§impl From<u64> for FileTime
impl From<u64> for FileTime
Source§fn from(ft: u64) -> FileTime
fn from(ft: u64) -> FileTime
Converts the file time to a FileTime
.
Equivalent to FileTime::new
except that it is not callable in const
contexts.
§Examples
assert_eq!(FileTime::from(u64::MIN), FileTime::NT_TIME_EPOCH);
assert_eq!(
FileTime::from(116_444_736_000_000_000),
FileTime::UNIX_EPOCH
);
assert_eq!(FileTime::from(u64::MAX), FileTime::MAX);
Source§impl FromStr for FileTime
impl FromStr for FileTime
Source§fn from_str(s: &str) -> Result<FileTime, <FileTime as FromStr>::Err>
fn from_str(s: &str) -> Result<FileTime, <FileTime as FromStr>::Err>
Parses a string s
to return a value of FileTime
.
The string is expected to be a decimal non-negative integer. If the
string is not a decimal integer, use u64::from_str_radix
and
FileTime::new
instead.
§Errors
Returns Err
if u64::from_str
returns an error.
§Examples
assert_eq!(FileTime::from_str("0").unwrap(), FileTime::NT_TIME_EPOCH);
assert_eq!(
FileTime::from_str("116444736000000000").unwrap(),
FileTime::UNIX_EPOCH
);
assert_eq!(
FileTime::from_str("+18446744073709551615").unwrap(),
FileTime::MAX
);
assert!(FileTime::from_str("").is_err());
assert!(FileTime::from_str("a").is_err());
assert!(FileTime::from_str("-1").is_err());
assert!(FileTime::from_str("+").is_err());
assert!(FileTime::from_str("0 ").is_err());
assert!(FileTime::from_str("18446744073709551616").is_err());
Source§type Err = ParseFileTimeError
type Err = ParseFileTimeError
Source§impl Ord for FileTime
impl Ord for FileTime
Source§impl PartialEq<OffsetDateTime> for FileTime
impl PartialEq<OffsetDateTime> for FileTime
Source§impl PartialEq<SystemTime> for FileTime
impl PartialEq<SystemTime> for FileTime
Source§impl PartialOrd<OffsetDateTime> for FileTime
impl PartialOrd<OffsetDateTime> for FileTime
Source§impl PartialOrd<SystemTime> for FileTime
impl PartialOrd<SystemTime> for FileTime
Source§impl PartialOrd for FileTime
impl PartialOrd for FileTime
Source§impl Sub<OffsetDateTime> for FileTime
impl Sub<OffsetDateTime> for FileTime
Source§impl Sub<SystemTime> for FileTime
impl Sub<SystemTime> for FileTime
Source§impl SubAssign<Duration> for FileTime
impl SubAssign<Duration> for FileTime
Source§fn sub_assign(&mut self, rhs: Duration)
fn sub_assign(&mut self, rhs: Duration)
-=
operation. Read moreSource§impl SubAssign<Duration> for FileTime
impl SubAssign<Duration> for FileTime
Source§fn sub_assign(&mut self, rhs: Duration)
fn sub_assign(&mut self, rhs: Duration)
-=
operation. Read moreSource§impl TryFrom<OffsetDateTime> for FileTime
impl TryFrom<OffsetDateTime> for FileTime
Source§fn try_from(
dt: OffsetDateTime,
) -> Result<FileTime, <FileTime as TryFrom<OffsetDateTime>>::Error>
fn try_from( dt: OffsetDateTime, ) -> Result<FileTime, <FileTime as TryFrom<OffsetDateTime>>::Error>
Converts a OffsetDateTime
to a FileTime
.
§Errors
Returns Err
if dt
is out of range for the file time.
§Examples
assert_eq!(
FileTime::try_from(datetime!(1601-01-01 00:00 UTC)).unwrap(),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::try_from(OffsetDateTime::UNIX_EPOCH).unwrap(),
FileTime::UNIX_EPOCH
);
// Before `1601-01-01 00:00:00 UTC`.
assert!(
FileTime::try_from(datetime!(1601-01-01 00:00 UTC) - Duration::nanoseconds(100)).is_err()
);
With the large-dates
feature enabled, returns Err
if
OffsetDateTime
represents after “+60056-05-28 05:36:10.955161500
UTC”:
assert!(FileTime::try_from(
datetime!(+60056-05-28 05:36:10.955_161_500 UTC) + Duration::nanoseconds(100)
)
.is_err());
Source§type Error = FileTimeRangeError
type Error = FileTimeRangeError
Source§impl TryFrom<SystemTime> for FileTime
impl TryFrom<SystemTime> for FileTime
Source§fn try_from(
st: SystemTime,
) -> Result<FileTime, <FileTime as TryFrom<SystemTime>>::Error>
fn try_from( st: SystemTime, ) -> Result<FileTime, <FileTime as TryFrom<SystemTime>>::Error>
Converts a SystemTime
to a FileTime
.
§Errors
Returns Err
if time
is out of range for the file time.
§Examples
assert_eq!(
FileTime::try_from(SystemTime::UNIX_EPOCH - Duration::from_secs(11_644_473_600)).unwrap(),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::try_from(SystemTime::UNIX_EPOCH).unwrap(),
FileTime::UNIX_EPOCH
);
// Before `1601-01-01 00:00:00 UTC`.
assert!(FileTime::try_from(
SystemTime::UNIX_EPOCH - Duration::from_nanos(11_644_473_600_000_000_100)
)
.is_err());
// After `+60056-05-28 05:36:10.955161500 UTC`.
#[cfg(not(windows))]
assert!(FileTime::try_from(
SystemTime::UNIX_EPOCH + Duration::new(1_833_029_933_770, 955_161_600)
)
.is_err());
Source§type Error = FileTimeRangeError
type Error = FileTimeRangeError
Source§impl TryFrom<i64> for FileTime
impl TryFrom<i64> for FileTime
Source§fn try_from(ft: i64) -> Result<FileTime, <FileTime as TryFrom<i64>>::Error>
fn try_from(ft: i64) -> Result<FileTime, <FileTime as TryFrom<i64>>::Error>
Converts the file time to a FileTime
.
The file time may be represented as an i64
value in WinRT,1
.NET,23 etc.
§Errors
Returns Err
if ft
is negative.
§Examples
assert_eq!(
FileTime::try_from(i64::default()).unwrap(),
FileTime::NT_TIME_EPOCH
);
assert_eq!(
FileTime::try_from(116_444_736_000_000_000_i64).unwrap(),
FileTime::UNIX_EPOCH
);
assert!(FileTime::try_from(i64::MIN).is_err());