> 백엔드 개발 > PHP 튜토리얼 > PHP: Dates의 지옥에서 탈출하는 실용적인 방법

PHP: Dates의 지옥에서 탈출하는 실용적인 방법

DDD
풀어 주다: 2024-11-30 09:14:19
원래의
175명이 탐색했습니다.

비즈니스에 중요한 기능은 구독, 반복 결제, 예약 등 날짜에 의존하는 경우가 많습니다.

PHP 프로그래머라면 날짜/시간을 조작해야 할 수도 있습니다.

타사 라이브러리를 시작하시나요? 정말?

일반적으로 기본 API를 사용하여 기술을 익히고 언어 작동 방식을 이해하는 것이 좋지만 실용적으로 생각합시다.

Carbon은 DateTimeInterface, JsonSerialized 및 기타 기본 PHP 도구를 확장하는 강력한 라이브러리입니다.

기존 날짜 개체와 새 날짜 개체를 모두 조작하는 데 유용한 도우미를 제공합니다.

// Tomorrow
CarbonImmutable::now()->add(1, 'day');

// Copy instance from another API
$dateTime = new \DateTime('first day of January 2025');
$carbon = Carbon::instance($dateTime);

// Parsing values
$date = Carbon::parse('2050-01-01 12:34:00', 'UTC');
로그인 후 복사

기본으로 돌아가기

Carbon은 기본 API를 확장하지만 DateTime 개체는 이미 날짜와 시간을 계산하는 도구를 제공합니다.

$date = new DateTime('2024-07-23');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d');

$date2 = new DateTime('2024-08-03');
$interval = $date->diff($date2);
echo $interval->format('%R%a days');
로그인 후 복사

문자열을 전달하여 특정 출력을 얻거나 간격과 기간을 계산할 수 있습니다.

그렇다면 탄소와 같은 추가 레이어를 사용하는 이유는 무엇입니까?

더 나은 가독성

$yesterday = Carbon::yesterday();
$today = Carbon::today();
$now = Carbon::now();
$tomorrow = Carbon::tomorrow();
$futureDate = Carbon::today()->addDays(21)->format('Y-m-d');

if ($now->isEndOfDay()) {
    // Some code
}
로그인 후 복사

라이브러리는 다양한 오류가 발생하기 쉬운 날짜 비교에 편리하고 강력합니다.

쉬운 현지화

Carbon은 로캘을 편리하게 처리합니다.

$now = Carbon::now()->locale('fr_FR');
echo $now->monthName;
로그인 후 복사

오버플로 처리

월을 더하거나 뺄 때 기본 PHP DateTime 동작이 오해를 불러일으킬 수 있습니다. 넘칠 수 있어요!

때때로 이러한 동작이 필요할 수도 있지만 Carbon은 더 나은 제어 기능을 제공합니다.

Carbon::useMonthsOverflow(false);
Carbon::resetMonthsOverflow();
로그인 후 복사

연도 또는 월을 조작할 때 각 메서드에서 오버플로를 구성할 수도 있습니다(예: subMonthsNoOverflow, addMonthsWithOverflow).

단위 테스트 날짜

날짜는 가변성으로 인해 단위 테스트에서 문제가 될 수 있습니다.

Carbon은 모의를 위한 고급 기능을 제공하여 테스트가 일관되고 안정적으로 유지되도록 보장합니다.

이렇게 하면 CI/CD 파이프라인을 손상시킬 수 있는 무작위 오류를 방지할 수 있습니다.

날짜/시간과 관련된 일반적인 함정을 피하는 방법

Carbon 사용 여부에 관계없이 잠재적인 버그와 불일치를 줄이는 실용적인 방법이 있습니다.

오류를 무시하지 마세요

최신 버전의 PHP에는 더 나은 날짜/시간 예외가 도입되어 예기치 않은 입력을 보다 일관되게 포착할 수 있습니다.

그러나 구현을 통해 때때로 나쁜 오류가 발생하지 않을 수 있습니다.

$dateInput = '2dsds';
$timestamp = strtotime($dateInput);
echo date('Y-m-d', $timestamp); // Defaults back to 1970-01-01
로그인 후 복사

다음 코드는 DateTime 객체를 사용하더라도 개선되지 않습니다.

$dateInput = '2024-02-30'; // Invalid date (February has 28 days, 29 at most)
$date = new DateTime($dateInput);
echo $date->format('l \t\h\e jS F'); // Outputs "Friday the 1st March"
로그인 후 복사

그러므로 항상 날짜/시간을 확인하세요.

$dateInput = '2dsds';
$timestamp = strtotime($dateInput);

if (false === $timestamp) {
    throw new InvalidArgumentException();
}

echo date('Y-m-d', $timestamp);

로그인 후 복사

입력 내용을 자세히 확인하세요.

$format = 'Y-m-d';
$dateInput = '2024-02-30';
$dateInfo = date_parse($dateInput);
if (!checkdate($dateInfo['day'], $dateInfo['month'], $dateInfo['year'])) {
    throw new InvalidArgumentException();
}

$date = DateTimeImmutable::createFromFormat($format, $dateInput);
echo $date->format('l \t\h\e jS F');
로그인 후 복사

우발적인 돌연변이 방지

DateTimeImmutable 또는 CarbonImmutable은 생성 후에 변경할 수 없습니다. 대부분의 경우 초기 날짜를 변경할 필요가 없습니다.

코드의 다른 부분이 해당 인스턴스에 의존하는 경우 불쾌한 버그가 발생할 수 있습니다.

불변 형식은 이러한 부작용을 방지하며 일반적으로 가독성과 테스트에 더 좋습니다.

시간대를 무시하지 마세요

시간대를 무시하는 것은 위험합니다.

PHP: Practical ways to escape from the hell of Dates

PHP: 시간대 이해

spO0q ・ 8월 4일

#php #초보자 #프로그램 작성

앱에 기본 시간대를 지정하지 않으면 서버가 이를 결정합니다.

그러나 귀하의 애플리케이션은 다른 시간대의 서버에 배포될 수 있습니다.

일광 절약 시간제나 저장 형식(예: UTC 대 현지 시간)과 같은 복잡성으로 인해 어려움을 겪을 수도 있지만 모범 사례를 장려하는 라이브러리를 사용하면 문제가 덜할 수 있습니다.

마무리

네이티브 API를 사용하면 날짜와 시간에 대한 고급 조작이 가능하며 Carbon은 이를 훌륭하게 확장합니다.

PHP 개발자는 이 추가 레이어를 활용하여 계산을 단순화하고 가독성을 높일 수 있습니다.

사용 여부에 관계없이 기본 PHP DateTime 객체의 기본 동작을 이해해야 합니다.

위 내용은 PHP: Dates의 지옥에서 탈출하는 실용적인 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿