source

strto 시간과 날짜를 사용하여 현재와 비교하여 이전 달과 연도를 얻는 방법은 무엇입니까?

ittop 2023. 8. 10. 21:28
반응형

strto 시간과 날짜를 사용하여 현재와 비교하여 이전 달과 연도를 얻는 방법은 무엇입니까?

현재 날짜와 비교하여 전월과 연도를 받아야 합니다.

그러나 다음 예를 참조하십시오.

// Today is 2011-03-30
echo date('Y-m-d', strtotime('last month'));

// Output:
2011-03-02

이러한 동작은 2월과 3월의 일수가 다르기 때문에 (어느 정도) 이해할 수 있으며, 위의 예시의 코드는 제가 필요로 하는 것이지만 매월 1일과 28일 사이에는 100%만 올바르게 작동합니다.

달과 을 얻는 해 보세요.date("Y-m")한 가장 으로, 중 하는 것은 가능한 한 가장 우아한 방식으로, 1년 중 매일 작동하는 것은 무엇입니까?최적의 솔루션은 다음을 기반으로 합니다.strtotime인수 구문 분석.

업데이트. 요구 사항을 조금 명확히 하기 위해.

지난 몇 달 동안의 통계를 얻을 수 있는 코드가 있지만, 지난달의 통계를 먼저 보여주고 필요할 때 다른 달을 로드합니다.그것은 의도된 목적입니다.그래서 이번 달 중에 전월 통계를 로드하려면 몇 월 연도를 당겨야 하는지 알고 싶습니다.

또한 시간대를 인식하는 코드가 있습니다(지금 당장은 그다지 중요하지 않습니다).strtotime날짜 한할 수 . - 내 날 짜 시 초 입 부 문 호 다 있 니 습 수 조 정 할 을 간 다 사 날 를 화 기 열 음 자 용 한 짜 환 되 을 으 - 하strtotime-호환 가능한 문자열.

몇 가지 조건부와 기본적인 수학으로 할 수 있다는 것은 알지만, 예를 들어, (물론 제대로 작동했다면) 이것과 비교하면, 그것은 정말 엉망입니다.

echo tz::date('last month')->format('Y-d')

저는 , 서단이지달전과연필다도니만요나합에중나, 는래그▁a에▁so▁previous나중▁month.strtotime-호환 패션

대답(고마워, @dnagirl):

// Today is 2011-03-30
echo date('Y-m-d', strtotime('first day of last month')); // Output: 2011-02-01

수업을 한 번 보세요.계산을 올바르게 수행해야 하며 날짜 형식이 다음과 호환되어야 합니다.strttotime다음과 같은 것:

$datestring='2011-03-30 first day of last month';
$dt=date_create($datestring);
echo $dt->format('Y-m'); //2011-02

하루 자체가 중요하지 않다면 다음과 같이 하십시오.

echo date('Y-m-d', strtotime(date('Y-m')." -1 month"));

저는 오늘 31일에 같은 문제가 있어서 답을 찾았습니다.일부 사람들이 제안하는 것처럼 php의 버그는 아니지만 (일부 이후의) 예상되는 기능입니다. 게시물에 따르면 strtime이 실제로 수행하는 작업은 월을 1씩 뒤로 설정하고 일 수를 수정하지 않습니다.그래서 오늘 5월 31일 같은 경우에는 4월부터 31일까지 유효하지 않은 날짜를 찾고 있습니다.그래서 4월 30일이 걸리고 하루가 지나면 5월 1일이 됩니다.

2011-03-30의 예에서는 2월 30일로 한 달 뒤로 돌아가며, 2월에는 28일만 있기 때문에 유효하지 않습니다.그런 다음 해당 날짜(30-28 = 2)의 차이가 발생한 다음 2월 28일(3월 2일)을 이틀 지나 이동합니다.

다른 사람들이 지적했듯이, "지난 달"을 얻는 가장 좋은 방법은 strtotime 또는 DateTime 객체를 사용하여 "첫 번째 날" 또는 "마지막 날"을 추가하는 것입니다.

// Today being 2012-05-31
//All the following return 2012-04-30
echo date('Y-m-d', strtotime("last day of -1 month"));
echo date('Y-m-d', strtotime("last day of last month"));
echo date_create("last day of -1 month")->format('Y-m-d'); 

// All the following return 2012-04-01
echo date('Y-m-d', strtotime("first day of -1 month")); 
echo date('Y-m-d', strtotime("first day of last month"));
echo date_create("first day of -1 month")->format('Y-m-d');

따라서 이를 사용하여 쿼리 등을 만들 경우 날짜 범위를 만들 수 있습니다.

특정 날짜를 기준으로 이전 연도와 월을 지정하고 DateTime을 사용할 수 있도록 하려면 다음 작업을 수행할 수 있습니다.

$d = new \DateTimeImmutable('2013-01-01', new \DateTimeZone('UTC')); 
$firstDay = $d->modify('first day of previous month');
$year = $firstDay->format('Y'); //2012
$month = $firstDay->format('m'); //12
date('Y-m', strtotime('first day of last month'));

strtotime 번째 2주차입니다.timestamp첫 번째 매개 변수를 두 번째 매개 변수에 상대적으로 만드는 매개 변수입니다.이렇게 할 수 있습니다.

date('Y-m', strtotime('-1 month', time()))

내가 당신이 원하는 질문을 정확하게 이해했다면 지난 달과 그 해에:

<?php

  $month = date('m');
  $year = date('Y');
  $last_month = $month-1%12;
  echo ($last_month==0?($year-1):$year)."-".($last_month==0?'12':$last_month);

?>

다음은 예입니다. http://codepad.org/c99nVKG8

아, 그것은 한 사람이 언급한 것처럼 버그가 아닙니다.이는 한 달의 일 수가 종종 다르기 때문에 예상되는 동작입니다.strtotime을 사용하여 전월을 얻는 가장 쉬운 방법은 아마도 이달 1일부터 -1개월을 사용하는 것입니다.

$date_string = date('Y-m', strtotime('-1 month', strtotime(date('Y-m-01'))));

당신은 strtime 함수에서 버그를 발견한 것 같습니다.제가 이 문제를 해결해야 할 때마다, 저는 항상 월/년 값에 대한 수학을 하고 있다는 것을 알게 됩니다.다음과 같은 방법을 사용해 보십시오.

$LastMonth = (date('n') - 1) % 12;
$Year      =  date('Y') - !$LastMonth;
date("m-Y", strtotime("-1 months")); 

이것을 해결할 것입니다.

아마도 당신이 원하는 것보다 조금 더 길게 감길 수도 있지만, 나는 더 읽기 쉽게 하기 위해 필요한 것보다 더 많은 코드를 사용했습니다.

즉, 여러분이 얻고 있는 것과 같은 결과가 나옵니다. 여러분이 원하는 것은 무엇입니까?/그것이 나오기를 기대합니까?

//Today is whenever I want it to be.
$today = mktime(0,0,0,3,31,2011);

$hour   = date("H",$today);
$minute = date("i",$today);
$second = date("s",$today);
$month  = date("m",$today);
$day    = date("d",$today);
$year   = date("Y",$today);

echo "Today: ".date('Y-m-d', $today)."<br/>";
echo "Recalulated: ".date("Y-m-d",mktime($hour,$minute,$second,$month-1,$day,$year));

월과 연도만 원하는 경우 '오늘'일이 아닌 '01'일로 설정합니다.

 $day = 1;

그게 당신에게 필요한 것을 줄 겁니다.시간, 분, 초를 0으로 설정하면 사용할 필요가 없을 뿐만 아니라 시간, 분 및 초를 0으로 설정할 수도 있습니다.

 date("Y-m",mktime(0,0,0,$month-1,1,$year);

꽤 많이 줄였습니다 ;-)

이는 전월이 현재 달보다 일 수가 적기 때문입니다.저는 우선 전월이 현재보다 적은 날이 있는지 확인하고 이를 바탕으로 계산을 변경하여 수정했습니다.

일 수가 적으면 -1개월의 마지막 날을 얻고 그렇지 않으면 현재 날짜 -1개월을 얻습니다.

if (date('d') > date('d', strtotime('last day of -1 month')))
{
    $first_end = date('Y-m-d', strtotime('last day of -1 month'));
}
else
{
    $first_end = date('Y-m-d', strtotime('-1 month'));
}

DateTime 솔루션을 사용할 수 있는 경우 이 스니펫은 1월에 이 솔루션을 실행할 때 발생할 수 있는 트랩을 피하기 위해 지난 달과 지난달의 연도를 반환합니다.

function fn_LastMonthYearNumber()
{
 $now = new DateTime();
 $lastMonth = $now->sub(new DateInterval('P1M'));
 $lm= $lastMonth->format('m');
 $ly= $lastMonth->format('Y');
 return array($lm,$ly);
}
//return timestamp, use to format month, year as per requirement
function getMonthYear($beforeMonth = '') {
    if($beforeMonth !="" && $beforeMonth >= 1) {
        $date = date('Y')."-".date('m')."-15";
        $timestamp_before = strtotime( $date . ' -'.$beforeMonth.' month' );
        return $timestamp_before;
    } else {
        $time= time();
        return $time;
    }
}


//call function
$month_year = date("Y-m",getMonthYear(1));// last month before  current month
$month_year = date("Y-m",getMonthYear(2)); // second last month before current month
function getOnemonthBefore($date){
    $day = intval(date("t", strtotime("$date")));//get the last day of the month
    $month_date = date("y-m-d",strtotime("$date -$day days"));//get the day 1 month before
    return $month_date;
}

결과 날짜는 입력 월이 구성된 일 수에 따라 달라집니다.입력 월이 2월(28일)인 경우 2월 5일 전 28일은 1월 8일입니다.입력이 5월 17일인 경우 31일 전은 4월 16일입니다.마찬가지로 입력이 5월 31일이면 결과 날짜는 4월 30일이 됩니다.

참고: 입력에 완료 날짜('y-m-d')가 걸리고 출력('y-m-d')이 필요에 따라 이 코드를 수정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5489502/how-to-get-previous-month-and-year-relative-to-today-using-strtotime-and-date

반응형