PHP, obtenir la date de demain à partir de la date


88

J'ai une date PHP sous la forme de 2013-01-22et je veux obtenir la date de demain dans le même format, par exemple 2013-01-23.

Comment est-ce possible avec PHP?

Réponses:


201

Utiliser DateTime

$datetime = new DateTime('tomorrow');
echo $datetime->format('Y-m-d H:i:s');

Ou:

$datetime = new DateTime('2013-01-22');
$datetime->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');

Ou:

$datetime = new DateTime('2013-01-22');
$datetime->add(new DateInterval("P1D"));
echo $datetime->format('Y-m-d H:i:s');

Ou en PHP 5.4+:

echo (new DateTime('2013-01-22'))->add(new DateInterval("P1D"))
                                 ->format('Y-m-d H:i:s');

1
Cela utilise le courant, je dois passer à une date donnée.
Justin

La deuxième façon est probablement la meilleure.
nickb

72
 $tomorrow = date("Y-m-d", strtotime('tomorrow'));

ou

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

Lien d'aide: STRTOTIME ()


1
J'ai utilisé celui-ci et de toutes les réponses est la version la plus courte et la plus simple, merci!
Bombelman

17

Depuis que vous l'avez tagué avec , vous pouvez l'utiliser avec le +1 daymodificateur comme ceci:

$tomorrow_timestamp = strtotime('+1 day', strtotime('2013-01-22'));

Cela dit, c'est une bien meilleure solution pour utiliser DateTime .


14
<? php 

//1 Day = 24*60*60 = 86400

echo date("d-m-Y", time()+86400); 

?>

17
Notez que cela échouera dans les cas extrêmes (heure d'été).
JJJ

Cette réponse est fausse. J'ai un cronjob qui utilise ceci en boucle, et le système est mort.
jewelnguyen8


3

Utilisez DateTime:

Pour obtenir demain à partir de maintenant:

$d = new DateTime('+1day');
$tomorrow = $d->format('d/m/Y h.i.s');
echo $tomorrow;

Résultats: 28/06/2017 08.13.20

Pour obtenir demain à partir d'une date:

$d = new DateTime('2017/06/10 08.16.35 +1day')
$tomorrow = $d->format('d/m/Y h.i.s');
echo $tomorrow;

Résultats: 06/11/2017 08.16.35

J'espère que ça aide!


1
/**
 * get tomorrow's date in the format requested, default to Y-m-d for MySQL (e.g. 2013-01-04)
 *
 * @param string
 *
 * @return string
 */
public static function getTomorrowsDate($format = 'Y-m-d')
{
    $date = new DateTime();
    $date->add(DateInterval::createFromDateString('tomorrow'));

    return $date->format($format);
}

1

Par étrange, il peut sembler que cela fonctionne parfaitement bien: date_create( '2016-02-01 + 1 day' );

echo date_create( $your_date . ' + 1 day' )->format( 'Y-m-d' );

Devrait le faire


0

Premièrement, trouver des abstractions correctes est toujours une clé. clé de la lisibilité, de la maintenabilité et de l'extensibilité.

Ici, un candidat assez évident est un ISO8601DateTime. Il existe au moins deux implémentations: la première est une date / heure analysée à partir d'une chaîne et la seconde est demain. Par conséquent, il existe deux classes qui peuvent être utilisées et leur combinaison aboutit au résultat (presque) souhaité:

new Tomorrow(new FromISO8601('2013-01-22'));

Les deux objets sont une date / heure ISO8601, leur représentation textuelle n'est donc pas exactement ce dont vous avez besoin. Le coup final est donc de leur faire prendre une forme de date:

new Date(
    new Tomorrow(
        new FromISO8601('2013-01-22')
    )
);

Puisque vous avez besoin d'une représentation textuelle, pas seulement d'un objet, vous invoquez un value() méthode.

Pour en savoir plus sur cette approche, jetez un œil à cet article .


-1

voici la fonction de travail

function plus_one_day($date){
 $date2 = formatDate4db($date);
 $date1 = str_replace('-', '/', $date2);
 $tomorrow = date('Y-m-d',strtotime($date1 . "+1 days"));
 return $tomorrow; }

que fait la fonction formatDate4db? Pourquoi remplacer les tirets par des barres obliques dans la chaîne?
braindigitalis

La fonction formatDate4db passe la date et crée un format comme le format de base de données mysql et la fonction str_replace, j'ai le format de date 2019/12/10 et le remplace par -
Muhammad Awais Zulifqar

-4
$date = '2013-01-22';
$time = strtotime($date) + 86400;
echo date('Y-m-d', $time);

Où 86400 est le nombre de secondes dans une journée.


11
Non, un jour n'a pas toujours 86400 secondes.
nickb

Je ne comprends pas le problème. Veuillez expliquer @nickb
Aiyion.Prime

@ Aiyion.Prime jours qui font le passage à l'heure d'été ou à partir de l'heure d'été n'ont pas 86400 secondes
dumazy

J'y ai pensé, l'heure d'été est lancée à deux heures et ne devrait donc jamais aboutir à une date différente?
Aiyion.Prime

Le problème n'est pas l'heure d'été. Les heures dans une base de données doivent vraiment être stockées au format UTC qui n'a pas d'heure d'été. Si vous stockez vos dates en UTC, cela fonctionnera bien mais est un peu obtus.
braindigitalis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.