> 1); /** * Convert a 32 bit integer DOS date/time value to a UNIX timestamp value. * * @param int $dosTime Dos date/time * * @return int Unix timestamp */ public static function toUnixTimestamp($dosTime) { if ($dosTime < self::MIN_DOS_TIME) { $dosTime = self::MIN_DOS_TIME; } elseif ($dosTime > self::MAX_DOS_TIME) { $dosTime = self::MAX_DOS_TIME; } return mktime( ($dosTime >> 11) & 0x1f, // hour ($dosTime >> 5) & 0x3f, // minute 2 * ($dosTime & 0x1f), // second ($dosTime >> 21) & 0x0f, // month ($dosTime >> 16) & 0x1f, // day 1980 + (($dosTime >> 25) & 0x7f) // year ); } /** * Converts a UNIX timestamp value to a DOS date/time value. * * @param int $unixTimestamp the number of seconds since midnight, January 1st, * 1970 AD UTC * * @throws ZipException if unix timestamp is negative * * @return int a DOS date/time value reflecting the local time zone and * rounded down to even seconds * and is in between DateTimeConverter::MIN_DOS_TIME and DateTimeConverter::MAX_DOS_TIME */ public static function toDosTime($unixTimestamp) { if ($unixTimestamp < 0) { throw new ZipException('Negative unix timestamp: ' . $unixTimestamp); } $date = getdate($unixTimestamp); if ($date['year'] < 1980) { return self::MIN_DOS_TIME; } $date['year'] -= 1980; return $date['year'] << 25 | $date['mon'] << 21 | $date['mday'] << 16 | $date['hours'] << 11 | $date['minutes'] << 5 | $date['seconds'] >> 1; } }