programing tip

strtotime 및 date를 사용하여 오늘을 기준으로 이전 월과 연도를 얻는 방법은 무엇입니까?

itbloger 2020. 12. 29. 06:45
반응형

strtotime 및 date를 사용하여 오늘을 기준으로 이전 월과 연도를 얻는 방법은 무엇입니까?


현재 날짜를 기준으로 이전 월과 연도를 가져와야합니다.

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

// 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")를 가능한 한 가장 우아한 방식으로 얻는 방법은 일년 중 매일 작동합니까? 최적의 솔루션은 strtotime인수 구문 분석을 기반으로 합니다.

최신 정보. 요구 사항을 조금 명확히하기 위해.

지난 몇 달 동안의 통계를 가져 오는 코드가 있지만 먼저 지난 달의 통계를 표시 한 다음 필요할 때 다른 달을로드합니다. 그것은 의도 된 목적입니다. 따라서 이번 달에 이전 월 통계를로드하기 위해 어느 월-연도를 가져와야하는지 알아보고 싶습니다.

또한 시간대를 인식하고 (지금 당장은 중요하지 않음) strtotime호환되는 문자열을 입력으로 허용하고 (내부 날짜를 초기화하기 위해) 날짜 / 시간을 조정하고 strtotime호환되는 문자열을 사용하는 코드도 있습니다.

조건부와 기본 수학으로 거의 할 수 없다는 것을 알고 있지만, 예를 들어 (물론 제대로 작동한다면) 이것에 비해 정말 지저분합니다.

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

그래서, 나는 strtotime호환되는 방식으로 지난 달과 해만 필요합니다 .

답변 (감사합니다, @dnagirl) :

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

DateTime수업을 살펴보십시오 . 계산을 올바르게 수행하고 날짜 형식이 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버그는 아니지만 예상되는 기능입니다 (일부는 이후). 게시물 에 따르면 strtotime이 실제로하는 일은 월을 1로 뒤로 설정하고 일 수를 수정하지 않습니다. 따라서 오늘 5 월 31 일의 경우 잘못된 날짜 인 4 월 -31 일을 찾습니다. 따라서 4 월 30 일이 걸리고 1 일이 지나면 5 월 1 일이됩니다.

2011-03-30의 예에서는 2 월이 28 일밖에 없기 때문에 유효하지 않은 2 월 30 일로 한 달이 돌아갑니다. 그런 다음 해당 날짜의 차이 (30-28 = 2)가 소요되고 3 월 2 일인 2 월 28 일을지나 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 DateTime('2013-01-01', new DateTimeZone('UTC')); 
$d->modify('first day of previous month');
$year = $d->format('Y'); //2012
$month = $d->format('m'); //12

date('Y-m', strtotime('first day of last month'));

strtotime제가 timestamp제 파라미터에 대하여 제 1 파라미터를 확인 파라미터. 따라서 다음과 같이 할 수 있습니다.

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'))));

strtotime 함수에서 버그를 발견했다고 생각합니다. 이 문제를 해결해야 할 때마다 항상 월 / 년 값에 대해 수학을하고 있습니다. 다음과 같이 시도하십시오.

$LastMonth = (date('n') - 1) % 12;
$Year      =  date('Y') - !$LastMonth;

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

즉, 당신이 얻는 것과 동일한 결과가 나옵니다-당신이 원하는 것이 무엇입니까 / 나올 것으로 기대합니까?

//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));

If you just want the month and year, then just set the day to be '01' rather than taking 'todays' day:

 $day = 1;

That should give you what you need. You can just set the hour, minute and second to zero as well as you aren't interested in using those.

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

Cuts it down quite a bit ;-)


This is because the previous month has less days than the current month. I've fixed this by first checking if the previous month has less days that the current and changing the calculation based on it.

If it has less days get the last day of -1 month else get the current day -1 month:

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'));
}

If a DateTime solution is acceptable this snippet returns the year of last month and month of last month avoiding the possible trap when you run this in January.

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;
}

The resulting date is dependent to the number of days the input month is consist of. If input month is february (28 days), 28 days before february 5 is january 8. If input is may 17, 31 days before is april 16. Likewise, if input is may 31, resulting date will be april 30.

NOTE: the input takes complete date ('y-m-d') and outputs ('y-m-d') you can modify this code to suit your needs.

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

반응형