> 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 (self::MIN_DOS_TIME > $dosTime) { $dosTime = self::MIN_DOS_TIME; } elseif (self::MAX_DOS_TIME < $dosTime) { $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. * @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. * @throws ZipException If unix timestamp is negative. */ public static function toDosTime($unixTimestamp) { if (0 > $unixTimestamp) { 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); } }