Как получить следующие 3 месяца с текущего месяца в php? [Дубликат]

Существуют небольшие различия в зависимости от того, говорите ли вы о «примитивах» или «типах объектов»; то же самое можно сказать, если вы говорите о «статических» или «нестатических» членах; вы можете также смешать все вышеперечисленное ...

Вот пример (вы можете запустить его):

public final class MyEqualityTest
{
    public static void main( String args[] )
    {
        String s1 = new String( "Test" );
        String s2 = new String( "Test" );

        System.out.println( "\n1 - PRIMITIVES ");
        System.out.println( s1 == s2 ); // false
        System.out.println( s1.equals( s2 )); // true

        A a1 = new A();
        A a2 = new A();

        System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
        System.out.println( a1 == a2 ); // false
        System.out.println( a1.s == a2.s ); // true
        System.out.println( a1.s.equals( a2.s ) ); // true

        B b1 = new B();
        B b2 = new B();

        System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
        System.out.println( b1 == b2 ); // false
        System.out.println( b1.getS() == b2.getS() ); // false
        System.out.println( b1.getS().equals( b2.getS() ) ); // true
    }
}

final class A
{
    // static
    public static String s;
    A()
    {
        this.s = new String( "aTest" );
    }
}

final class B
{
    private String s;
    B()
    {
        this.s = new String( "aTest" );
    }

    public String getS()
    {
        return s;
    }

}

Вы можете сравнить объяснения для «==» (Equality Оператор) и ".equals (...)" (метод в классе java.lang.Object) через эти ссылки:

9
задан morgi 21 May 2012 в 08:56
поделиться

4 ответа

Вам не хватает второго аргумента для второго вызова strtotime():

echo date('d/m/Y', strtotime('+2 months'));
21
ответ дан Alix Axel 19 August 2018 в 08:38
поделиться
  • 1
    Будьте особенно осторожны при использовании строя. 31 июля дата («dmY») дает «31072014». в то время как дата ('dmY', время выполнения ('- 1 месяц')) дает "01072014" (Я ожидал «30062014»). – Paul Voss 5 August 2014 в 16:50

Использование DateTime-> add () или DateTime-> modify ()

Если вы работаете с существующим объектом DateTime, вы можете используйте один из них:

// Your date
$date = new DateTime(); // empty for now or pass any date string as param

// Adding
$date->add(new DateInterval('P2M')); // where P2M means "plus 2 months"

// or even easier
$date->modify('+2 months');

// Checking
echo $date->format('Y-m-d');

Опасайтесь добавления месяцев в PHP, он может переполняться до следующего месяца, если день в исходной дате превышает общее количество дней в новом месяце. То же переполнение происходит с високосными годами при добавлении лет. Как-то это не считается ошибкой разработчиков PHP и просто документируется без решения. Подробнее здесь: PHP DateTime :: изменить добавление и вычитание месяцев

Я нашел, что это самое точечное решение для решения проблемы переполнения:

$day = $date->format('j');
$date->modify('first day of +2 months')->modify('+'. (min($day, $date->format('t')) - 1) .' days');
0
ответ дан Alph.Dev 19 August 2018 в 08:38
поделиться

Если сегодня «ГГГГ-мм-31», а в следующем месяце не будет 31-го дня, он отобразит следующий месяц этого дня, чтобы система отображала результат «+3 месяца» вместо «+2 месяца», результат.

Итак, я думаю, что это самая безопасная ситуация:

$end_date=date("Y-m-d",strtotime("+2 month",strtotime(date("Y-m-01",strtotime("now") ) )));

Сначала измените дату на первый день.

1
ответ дан Fenix Lam 19 August 2018 в 08:38
поделиться

Попробуйте использовать объект DateTime :

$date = new DateTime("+2 months");
echo $date->format("d/m/Y");
6
ответ дан John Conde 19 August 2018 в 08:38
поделиться
  • 1
    Правильно, но не относится к делу. – Stanislav Shabalin 14 May 2012 в 16:46
  • 2
    Почему этот ответ не имеет значения? Просто любопытный @StanislavShabalin – Muhammad Ibnuh 8 August 2017 в 14:11
  • 3
    @MuhammadIbnuh Честно говоря, я не могу вспомнить или понять это через пять лет :-) Может быть, потому, что для использования DateTime, когда у вас уже есть strtotime, и это нормально, просто исправить опечатку, как в принятом ответе. – Stanislav Shabalin 10 August 2017 в 14:54
Другие вопросы по тегам:

Похожие вопросы: