Carbon PHP Loop через каждый месяц в диапазоне дат [дубликат]

Способ сделать это - использовать кортеж и деконструкцию, чтобы разрешить несколько присвоений в одном выражении:

public class Person
{
    public string Name { get; }
    public int Age { get; }

    public Person(string name, int age) => (Name, Age) = (name, age);
}

Начиная с C # 7.1 (представленного с помощью Visual Studio 2017 Update 3), компилятор код теперь оптимизирует фактическую конструкцию и деконструкцию кортежа. Таким образом, этот подход не имеет накладных расходов на производительность по сравнению с назначением «longhand».

4
задан Charles 15 February 2012 в 02:51
поделиться

2 ответа

Проблема заключается в том, что каждый месяц может иметь различное количество дней в них. Вопрос заключается в том, что вы делаете, когда хотите увеличить дату на 1 месяц. В документации на PHP, если вы на 31 января (или 30), и вы добавляете 1 месяц, каково ожидаемое поведение?

В феврале всего 29 дней. Вы хотите установить последний день месяца? Вы, как правило, более безопасно увеличиваетесь на определенное количество дней, если это то, что вы ищете, или статическую дату, основанную на текущей дате. Не зная, чего вы пытаетесь достичь, когда вы увеличиваете свой месяц, трудно сказать, как смотреть за ошибкой.

РЕДАКТИРОВАТЬ: Как упоминает кто-то в подобной записи, прокомментированной Майком Б выше, вы, вероятно, хотите сделать что-то там, где вы (в псевдокоде):

 1) Use cal_days_in_month() for the next month and save that number to a variable x
 2) If x >= current billing DOB, increment and be done
 3) DateTime::modify('last day')  (havent used this before but something along these lines) to set the date to the last date of the next month (set it to the 1st of the next month, then last day?)

Стоит отметить, что если вы используете переменную здесь как новое платежное значение, вы уничтожите свое исходное значение. Я бы сохранил дополнительное значение DB, которое является «первой датой выставления счетов» или просто «billing_day_of_month» или что-то еще, и используйте это, чтобы определить день месяца, который вы должны смотреть на

7
ответ дан DaOgre 20 August 2018 в 15:13
поделиться
  • 1
    Вы знаете, это очень очевидно. То, что я хотел достичь, - это платить моим клиентам ежемесячно, поэтому мне нужно увеличить срок их подписки на 1 месяц. Однако это довольно плохая реализация и запутанность для клиента, поэтому мне нужно выяснить другое решение. – Ronni Egeriis Persson 14 February 2012 в 23:47
  • 2
    Я думаю, здесь много парадоксов. Решение, которое я придумал, заключается в том, что если пользователь подписывается 29, 30 или 31 числа любого месяца, они будут выставлены счет за 3, 2 или 1 день, и их день подписки будет установлен на 28-й каждый месяц. Я выбираю это решение, а не устанавливаю каждый день выставления счетов каждому клиенту, потому что сервер, который будет обрабатывать платежи, не должен быть занят всего один день в месяц. – Ronni Egeriis Persson 15 February 2012 в 19:28
  • 3
    Было бы лучше просто увеличиваться на 30 дней, а не путаться с месяцами? Тогда мы можем избежать этой ситуации. – CMCDragonkai 2 December 2013 в 07:05

Если ваша цель состоит в том, чтобы строго увеличивать удобные для пользователя месяцы (таким образом, 3 месяца с 21 января должны быть 21 апреля), за исключением того, что сокращаются сроки членства в месяц (таким образом, 1 месяц с 31 января составляет 28 февраля / 29), вам нужно вернуться всего несколько дней, если вы перейдете в следующий месяц:

function addMonths($date,$months) {
  $orig_day = $date->format("d");
  $date->modify("+".$months." months");
  while ($date->format("d")<$orig_day && $date->format("d")<5)
    $date->modify("-1 day");
}

$d = new DateTime("2000-01-31");
addMonths($d,1);
echo $d->format("Y-m-d"); // 2000-02-29
0
ответ дан Sinus Mackowaty 20 August 2018 в 15:13
поделиться
Другие вопросы по тегам:

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