날짜에 하루 추가


172

날짜에 하루를 추가하는 코드는 추가하기 전에 날짜를 반환합니다. 하루를 추가 2009-09-30 20:24:00한 후 날짜 다음 달로 롤오버해야합니다.1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

나는 전에 비슷한 코드를 사용했는데, 여기서 내가 뭘 잘못하고 있니?

답변:


333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

PHP 5.2.0+의 경우 다음과 같이 할 수도 있습니다.

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
감사. $ stop_date = date ( 'Ymd H : i : s', strtotime ( "$ stop_date + 1 day"));
ian

11
문자열에 변수를 사용해서는 안됩니다. date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));@ w35l3y가 제공 한 답변에서와 같이 사용해야 합니다.
Cas Bloem

이 코드를 실행하기 전에 date_default_timezone_set 함수에 대한 호출을 추가해야합니다. 예를 들어 date_default_timezone_set ( 'Europe / Rome');
Luca Mastrostefano

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
이것은 가장 최근의 완벽한 솔루션입니다.
Cas Bloem

... 호스트에서 실행할 때 치명적인 오류가 발생하지 않는 한;)
Henrik Erlandsson

사과하지 마십시오. 어떤 사람들은 당신이 한 삼년 후 담 답변을 게시
Mawg는 분석 재개 모니카 말한다

1
이 코드를 실행하기 전에 date_default_timezone_set 함수에 대한 호출을 추가해야합니다. 예를 들어 date_default_timezone_set ( 'Europe / Rome');
Luca Mastrostefano

@LucaMastrostefano 아니오, 서버에 시간대를 설정해야합니다 ...
MH

28

가장 간단한 해결책 :

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

나는 하나의 라이너에서 당신의 방법을 좋아합니다echo (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba 나는 하나의 라이너가 PHP의 이전 버전에서 작동하지 않는다고 생각하는데 오류가 발생했습니다.Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

그것은 나를 위해 일했다 : 현재 날짜

$date = date('Y-m-d', strtotime("+1 day"));

언제라도 :

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
고맙습니다. 주어진 모든 솔루션 중 가장 간단합니다.
푸네 베르 마

2
당신은 반복과 중첩 할 필요가 없습니다 strtotime()- 그것은 하나의 호출로 모든 것을 처리 할 수 있습니다 :date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
니스, 이것은 가장 간단한 해결책입니다! 감사합니다
Angel


6

읽고 이해하기 쉬운 방법 :

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
하루 길이가 24 시간이 아닌 경우 일광 절약 시간제 변경으로 인해 때때로 실패합니다.
Nik Dow

3

나는 항상 86400 (하루에 초)을 추가합니다.

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

아마 당신이 할 수있는 가장 매끄러운 방법은 아니지만 작동합니다!


하루에 86401 초가 있으므로 86400을 추가 할 때 윤초를 어떻게 처리합니까? (확인, 몇 년마다 발생하지만 앱에 따라 중요 할 수 있음을 알고 있습니다)
Glen

1
모든 날에 86400 초가있는 것은 아닙니다. 실제로 미국의 대부분의 지역에서 1 년에 두 번 3600 개 더 적거나 추가 된 초가 있습니다.
Peter Kovacs

1
"Unix time"이 사용하기 때문에 윤초를 안전하게 무시할 수 있습니다. 이것은 다소 복잡하지만, 추가 정보를 원하시면이 문서 읽기 : derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
기독교 Davén

2
이 솔루션을 피해야합니다. 이유는 다음과 같습니다. stackoverflow.com/questions/2613338/…
mspir

1
전날에 86400 초를 추가하여 날짜를 추가하지 마십시오! 코드에 버그가 있습니다! 일광 절약 시간에는 작동하지 않습니다!
sbrbot

1

Doug Hays의 답변에 동의하지만 코드가 작동하지 않는 이유는 strtotime () 이 문자열이 아닌 두 번째 인수로 INT를 기대 하기 때문입니다 ( 날짜를 나타내는 것조차도).

최대 오류보고를 설정하면이 오류는 "잘못 구성된 숫자 값"오류 인 E_NOTICE 수준으로 표시됩니다.


1

modify()기존에 단위를 추가 할 수있어서 DateTime값.

DateTime현재 날짜와 시간 으로 새 객체를 만듭니다 .

$due_dt = new DateTime();

당신은 일단 DateTime객체를, 당신은 기간을 추가하거나 빼서 그 값을 조작 할 수 있습니다 :

$due_dt->modify('+1 day');

PHP Manual 에서 더 많은 내용을 읽을 수 있습니다 .


0

다음 코드는 DateTime 클래스와 해당 메서드 modify () 및 format ( ) :

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

코드의 문제점에 대한 답변이 이미 있기 때문에 일반적으로 날짜 시간으로 게임하는 방법에 대한 또 다른 관점을 제시하고 문제를 구체적으로 해결할 수 있습니다.

종종 솔루션 측면에서 문제를 제기하는 경우가 있습니다. 이것이 바로 명령형 코드로 끝나는 이유 중 하나입니다 . 그래도 작동하면 좋습니다. 유지 관리 가능한 다른 대안이있을뿐입니다. 그중 하나는 선언적 코드입니다. 요점은 무엇을 묻는 것입니다 거기에가는 방법 대신 필요한 입니다.

특정 경우에는 다음과 같이 보일 수 있습니다. 먼저, 무엇을 찾고 있는지, 즉 추상화 를 찾아야합니다 . 귀하의 경우 날짜 가 필요한 것 같습니다 . 날짜뿐만 아니라 표준 표현이있는 날짜도 있습니다. ISO8601 날짜라고 말하십시오. 최소한 두 가지 구현이 있습니다. 첫 번째는 ISO8601 형식의 문자열에서 구문 분석 된 날짜 (또는 실제로는 다른 형식의 문자열)이고 두 번째는 하루 후인 미래 날짜입니다. 따라서 전체 코드는 다음과 같습니다.

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

날짜 시간 저글링에 대한 더 많은 예제는 이것을 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.