6) { $timestamp = str_replace('.' . $subSeconds, '.' . substr($subSeconds, 0, 6), $timestamp); } $dt = new \DateTimeImmutable($timestamp); if (!$dt) { throw new \InvalidArgumentException(sprintf('Could not create a DateTime instance from given timestamp %s.', $timestamp)); } $nanos = (int) str_pad($subSeconds, 9, '0', STR_PAD_RIGHT); return [$dt, $nanos]; } /** * Create a DateTimeImmutable instance from a UNIX timestamp (i.e. seconds since epoch). * * @param int $seconds The unix timestamp. * @return \DateTimeImmutable */ private function createDateTimeFromSeconds($seconds) { return \DateTimeImmutable::createFromFormat('U', (string) $seconds, new \DateTimeZone('UTC')); } /** * Create a Timestamp string in an API-compatible format. * * @param \DateTimeInterface $dateTime The date time object. * @param int|null $ns The number of nanoseconds. If null, subseconds from * $dateTime will be used instead. * @return string */ private function formatTimeAsString(\DateTimeInterface $dateTime, $ns) { $dateTime = $dateTime->setTimeZone(new \DateTimeZone('UTC')); if ($ns === null) { return $dateTime->format(\DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Timestamp::FORMAT); } else { $ns = (string) $ns; $ns = str_pad($ns, 9, '0', STR_PAD_LEFT); if (substr($ns, 6, 3) === '000') { $ns = substr($ns, 0, 6); } return sprintf($dateTime->format(\DeliciousBrains\WP_Offload_Media\Gcp\Google\Cloud\Core\Timestamp::FORMAT_INTERPOLATE), $ns); } } /** * Format a timestamp for the API with nanosecond precision. * * @param \DateTimeInterface $dateTime The date time object. * @param int|null $ns The number of nanoseconds. If null, subseconds from * $dateTime will be used instead. * @return array */ private function formatTimeAsArray(\DateTimeInterface $dateTime, $ns) { if ($ns === null) { $ns = $dateTime->format('u'); } return ['seconds' => (int) $dateTime->format('U'), 'nanos' => (int) $ns]; } }