<?php /** * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Service; use DateTimeImmutable; use Exception; use InvalidArgumentException; class BirthdateParserService { /** * Try to parse the birthdate from LDAP. * Supports LDAP's generalized time syntax, YYYYMMDD and YYYY-MM-DD. * * @throws InvalidArgumentException If the format of then given date is unknown */ public function parseBirthdate(string $value): DateTimeImmutable { // Minimum LDAP generalized date is "1994121610Z" with 11 chars // While maximum other format is "1994-12-16" with 10 chars if (strlen($value) > strlen('YYYY-MM-DD')) { // Probably LDAP generalized time syntax $value = substr($value, 0, 8); } // Should be either YYYYMMDD or YYYY-MM-DD if (!preg_match('/^(\d{8}|\d{4}-\d{2}-\d{2})$/', $value)) { throw new InvalidArgumentException("Unknown date format: $value"); } try { return new DateTimeImmutable($value); } catch (Exception $e) { throw new InvalidArgumentException( "Unknown date format: $value", 0, $e, ); } } }