Fixed leap year birthdays without a year set.
This commit is contained in:
parent
3909cdf762
commit
3e2183b7b2
2 changed files with 37 additions and 6 deletions
27
src/DateCheck.php
Normal file
27
src/DateCheck.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
namespace Misuzu;
|
||||||
|
|
||||||
|
final class DateCheck {
|
||||||
|
public static function isLeapYear(int $year): bool {
|
||||||
|
return (($year % 4) === 0 && ($year % 100) !== 0)
|
||||||
|
|| ($year % 400) === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// i realise this implementation is probably horribly naive,
|
||||||
|
// but for what i need it will Do the Job
|
||||||
|
public static function isValidDate(int $year, int $month, int $day): bool {
|
||||||
|
if($month < 1 || $month > 12)
|
||||||
|
return false;
|
||||||
|
if($day < 1 || $day > 31)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if($month === 2)
|
||||||
|
$days = $year === 0 || self::isLeapYear($year) ? 29 : 28;
|
||||||
|
elseif($month === 4 || $month === 6 || $month === 9 || $month === 11)
|
||||||
|
$days = 30;
|
||||||
|
else
|
||||||
|
$days = 31;
|
||||||
|
|
||||||
|
return $day <= $days;
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ use DateTime;
|
||||||
use DateTimeZone;
|
use DateTimeZone;
|
||||||
use Index\XString;
|
use Index\XString;
|
||||||
use Index\Colour\Colour;
|
use Index\Colour\Colour;
|
||||||
|
use Misuzu\DateCheck;
|
||||||
use Misuzu\DB;
|
use Misuzu\DB;
|
||||||
use Misuzu\HasRankInterface;
|
use Misuzu\HasRankInterface;
|
||||||
use Misuzu\Memoizer;
|
use Misuzu\Memoizer;
|
||||||
|
@ -318,6 +319,10 @@ class User implements HasRankInterface {
|
||||||
return new DateTime($this->user_birthdate ?? '0000-01-01', new DateTimeZone('UTC'));
|
return new DateTime($this->user_birthdate ?? '0000-01-01', new DateTimeZone('UTC'));
|
||||||
}
|
}
|
||||||
public function setBirthdate(int $year, int $month, int $day): self {
|
public function setBirthdate(int $year, int $month, int $day): self {
|
||||||
|
// lowest leap year mariadb supports lol
|
||||||
|
// should probably split the date field and year field in the db but i'm afraid of internal dependencies rn
|
||||||
|
if($year < 1004)
|
||||||
|
$year = 1004;
|
||||||
$this->user_birthdate = $month < 1 || $day < 1 ? null : sprintf('%04d-%02d-%02d', $year, $month, $day);
|
$this->user_birthdate = $month < 1 || $day < 1 ? null : sprintf('%04d-%02d-%02d', $year, $month, $day);
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -652,14 +657,13 @@ class User implements HasRankInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function validateBirthdate(int $year, int $month, int $day, int $yearRange = 100): string {
|
public static function validateBirthdate(int $year, int $month, int $day, int $yearRange = 100): string {
|
||||||
if($year > 0) {
|
if($day !== 0 && $month !== 0) {
|
||||||
if($year < date('Y') - $yearRange || $year > date('Y'))
|
if($year > 0 && ($year < date('Y') - $yearRange || $year > date('Y')))
|
||||||
return 'year';
|
return 'year';
|
||||||
$checkYear = $year;
|
|
||||||
} else $checkYear = date('Y');
|
|
||||||
|
|
||||||
if(!($day === 0 && $month === 0) && !checkdate($month, $day, $checkYear))
|
if(!DateCheck::isValidDate($year, $month, $day))
|
||||||
return 'date';
|
return 'date';
|
||||||
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue