diff options
Diffstat (limited to 'vendor/maennchen/zipstream-php/src/Time.php')
-rw-r--r-- | vendor/maennchen/zipstream-php/src/Time.php | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/vendor/maennchen/zipstream-php/src/Time.php b/vendor/maennchen/zipstream-php/src/Time.php new file mode 100644 index 000000000..1b4121ca9 --- /dev/null +++ b/vendor/maennchen/zipstream-php/src/Time.php @@ -0,0 +1,39 @@ +<?php + +declare(strict_types=1); + +namespace ZipStream; + +use DateInterval; +use DateTimeImmutable; +use DateTimeInterface; +use ZipStream\Exception\DosTimeOverflowException; + +/** + * @internal + */ +abstract class Time +{ + private const DOS_MINIMUM_DATE = '1980-01-01 00:00:00Z'; + + public static function dateTimeToDosTime(DateTimeInterface $dateTime): int + { + $dosMinimumDate = new DateTimeImmutable(self::DOS_MINIMUM_DATE); + + if ($dateTime->getTimestamp() < $dosMinimumDate->getTimestamp()) { + throw new DosTimeOverflowException(dateTime: $dateTime); + } + + $dateTime = DateTimeImmutable::createFromInterface($dateTime)->sub(new DateInterval('P1980Y')); + + [$year, $month, $day, $hour, $minute, $second] = explode(' ', $dateTime->format('Y n j G i s')); + + return + ((int) $year << 25) | + ((int) $month << 21) | + ((int) $day << 16) | + ((int) $hour << 11) | + ((int) $minute << 5) | + ((int) $second >> 1); + } +} |