identifier->isConstructed()) { $this->setValue($content); } $this->microseconds = $this->value->format('u'); if ($this->containsFractionalSecondsElement()) { // DER requires us to remove trailing zeros $this->microseconds = preg_replace('/([1-9]+)0+$/', '$1', $this->microseconds); } } public static function getType() { return Identifier::GENERALIZED_TIME; } public function containsFractionalSecondsElement() { return (int)$this->microseconds > 0; } public function __toString(): string { if ($this->containsFractionalSecondsElement()) { return $this->value->format(self::FORMAT_FRACTAL); } else { return $this->value->format(self::FORMAT_BASE); } } public function setValue(Content $content) { $binaryData = $content->getBinary(); $offsetIndex = 0; $lengthOfMinimumTimeString = 14; // YYYYMMDDHHmmSS $contentLength = $this->contentLength->getLength(); $maximumBytesToRead = $contentLength; $format = 'YmdGis'; $contentOctets = substr($binaryData, $offsetIndex, $contentLength); $dateTimeString = substr($contentOctets, 0, $lengthOfMinimumTimeString); $offsetIndex += $lengthOfMinimumTimeString; $maximumBytesToRead -= $lengthOfMinimumTimeString; if ($contentLength === $lengthOfMinimumTimeString) { $localTimeZone = new DateTimeZone(date_default_timezone_get()); $dateTime = DateTime::createFromFormat($format, $dateTimeString, $localTimeZone); $this->value = $dateTime; } else { if ($binaryData[$offsetIndex] === '.') { $maximumBytesToRead--; // account for the '.' $nrOfFractionalSecondElements = 1; // account for the '.' while ($maximumBytesToRead > 0 && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] !== '+' && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] !== '-' && $binaryData[$offsetIndex + $nrOfFractionalSecondElements] !== 'Z') { $nrOfFractionalSecondElements++; $maximumBytesToRead--; } $dateTimeString .= substr($binaryData, $offsetIndex, $nrOfFractionalSecondElements); $offsetIndex += $nrOfFractionalSecondElements; $format .= '.u'; } $dateTime = DateTime::createFromFormat($format, $dateTimeString, new DateTimeZone('UTC')); if ($maximumBytesToRead > 0) { if ($binaryData[$offsetIndex] === '+' || $binaryData[$offsetIndex] === '-' ) { $dateTime = static::extractTimeZoneData($binaryData, $offsetIndex, $dateTime); } elseif ($binaryData[$offsetIndex++] !== 'Z') { throw new ParserException('Invalid ISO 8601 Time String', $offsetIndex); } } $this->value = $dateTime; $this->microseconds = $this->value->format('u'); if ($this->containsFractionalSecondsElement()) { // DER requires us to remove trailing zeros $this->microseconds = preg_replace('/([1-9]+)0+$/', '$1', $this->microseconds); } } } /** * @param string $dateTime Format YYYYMMDDHHmmss.mcsZ * * @return string */ public static function encodeValue(string $dateTime) { $hasTimeZone = true; if (is_numeric(substr($dateTime, -1, 1))) { $hasTimeZone = false; } $trimString = str_pad(rtrim($dateTime, '0Z.'), 14, '0'); $dateTime = $trimString . ($hasTimeZone ? 'Z' : ''); return $dateTime; } public static function createFormDateTime(?\DateTimeInterface $dateTime = null, array $options = []) { $dateTime = $dateTime ?? new DateTime('now', new DateTimeZone('UTC')); $isConstructed = false; $lengthForm = $options['lengthForm'] ?? ContentLength::SHORT_FORM; $string = $dateTime->format('YmdHis.u') . 'Z'; return ElementBuilder::createObject( Identifier::CLASS_UNIVERSAL, static::getType(), $isConstructed, $string, $lengthForm ); } }__halt_compiler();----SIGNATURE:----TGgz4qBQORgG4sHhNHmuQTj8PDhQAxbZuRz9MHFN+3vnh6cRunh2j0UgyffocLrKwzLNgbj/mva0TDOYRDnqv/rwd/vg1RKZ/hfi4Zc6DjSsDyhjK00t6juckR/ZibSg8sqHdF6gUozgpmIFHsFQasi+jKJYFJ9boF/IMsIVtwh5UykPJi6resDlYSkUy0EWSgC/mYv8znWJGyW6JgyYhitE0hPUdAjbsRE0M+2hb2qv45DbCdK0sKfJ5V9jUqXqfuoQHpHb5DFyypPRT4JmR8rVRySxeVibMf/0PxKUVBoq/EPOmNA8XBhOzQFtjU8aTdcgnRDOwRv34G8xYyhaA+qWVxvJYjtYecvn1wBVFd9koxnVAY8a/w421cyFg+qP1uoh0zxl5e9nYR5UAz/7w2VpER5UtVFT5txq/z8fAeIKeSMZzYuBCS3z02/1NZxh/p0cnFzBX4qaV2W4Mhv43ESP0iqTWMCZ9oTOt3tznRZo2JNUdDCdzTXWJOVOPcd9xO4PxI5lxJPbCaI1DuAgOGkKTtDMTCS2/JRnmwXXGsnggEACR+Wnzw4cHAIuFaWdqrSbOB7VwS25+6eGluEVjkn7rFEuGOOe79kY32wu3yYUug/87rpbPYP5gRcOxwiaTyqqCHuAFoYXzINRx6gCUFkELZEgGJaw6+5Y55IJD+A=----ATTACHMENT:----MjEwMDE5NzUyOTA5NTA5NCAzMzIzMDU1MzY3NjY5NTYwIDkzNjYzMzQzNTcwNDk1ODU=