DateHelper.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Helpers;
  4. use Carbon\Exceptions\InvalidDateException;
  5. use Exception;
  6. use Illuminate\Support\Carbon;
  7. use Illuminate\Support\Str;
  8. class DateHelper
  9. {
  10. const DB_FORMAT = 'Y-MM-DD';
  11. const HUMAN_TEXT_FORMAT = 'D MMMM Y';
  12. const HUMAN_DATE_FORMAT = 'DD.MM.Y';
  13. const MINIMAL_RANDOM_YEAR = 1970;
  14. const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;
  15. const YEARS = 'год|года|лет';
  16. const MONTHS = 'месяц|месяца|месяцев';
  17. const DAYS = 'день|дня|дней';
  18. /**
  19. * @param string $date
  20. * @param bool $monthAsNumber
  21. * @return string
  22. */
  23. public static function getHumanDate(string $date, bool $monthAsNumber = false): string
  24. {
  25. $format = ($monthAsNumber) ? self::HUMAN_DATE_FORMAT : self::HUMAN_TEXT_FORMAT;
  26. $dt = Carbon::parse($date);
  27. return Str::lower($dt->isoFormat($format));
  28. }
  29. /**
  30. * Случайная дата за последние X лет в формате YYYY-MM-DD
  31. * @param int|null $last_years
  32. * @return string
  33. */
  34. public static function getRandomDate(?int $last_years = 7): string
  35. {
  36. if (($last_years > ((int)date('Y') - self::MINIMAL_RANDOM_YEAR)) || ($last_years < 0)) {
  37. throw new InvalidDateException('last_years', $last_years, 1);
  38. }
  39. $seconds = rand(0, $last_years * self::SECONDS_IN_YEAR); // случайное число секунд в диапазоне от 0 до Х лет
  40. return Carbon::createFromTimestamp(strtotime('now') - $seconds)->isoFormat(self::DB_FORMAT);
  41. }
  42. /**
  43. * @param string $date
  44. * @return string
  45. */
  46. public static function getDateForDB(string $date): string
  47. {
  48. return Carbon::parse($date)->isoFormat(self::DB_FORMAT);
  49. }
  50. /**
  51. * @param string $date
  52. * @param int $months
  53. * @return string
  54. */
  55. public static function addMonths(string $date, int $months): string
  56. {
  57. return Carbon::parse($date)->addMonths($months)->isoFormat(self::DB_FORMAT);
  58. }
  59. /**
  60. * @param string $string
  61. * @return bool
  62. */
  63. public static function isDate(string $string): bool
  64. {
  65. if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$string)) {
  66. return true;
  67. } else {
  68. return false;
  69. }
  70. }
  71. }