PHP Дата: получать каждую пятницу в определенный час [дубликат]

Все подходы к копированию объектов в Java имеют серьезные недостатки:

Clone

  1. Метод clone () защищен, поэтому вы не можете вызвать его напрямую, если только класс пересматривает его с помощью общедоступного метода.
  2. clone () не вызывает конструктор. Любой конструктор. Он будет выделять память, назначить внутреннее поле class (которое вы можете прочитать через getClass()) и скопировать поля оригинала.

Для получения дополнительных сведений о проблемах с clone () см. пункт 11 книги Джошуа Блоха « Эффективная Java, второе издание »

Сериализация

Сериализация еще хуже; он имеет много недостатков clone(), а затем некоторых. Мое решение

Мое решение добавляет новый интерфейс к моим проектам:

public interface Copyable {
    T copy ();
    T createForCopy ();
    void copyTo (T dest);
}

Мое решение добавляет новый интерфейс к моим проектам:

public interface Copyable {
    T copy ();
    T createForCopy ();
    void copyTo (T dest);
}

Код выглядит так:

class Demo implements Copyable {
    public Demo copy () {
        Demo copy = createForCopy ();
        copyTo (copy);
        return copy;
    }
    public Demo createForCopy () {
        return new Demo ();
    }
    public void copyTo (Demo dest)
        super.copyTo (dest);
        ...copy fields of Demo here...
    }
}

К сожалению, мне нужно скопировать этот код ко всем моим объектам, но это всегда один и тот же код, поэтому я могу использовать шаблон редактора Eclipse. Преимущества:

  1. Я могу решить, какой конструктор вызвать и как инициализировать это поле.
  2. Инициализация происходит в детерминированном порядке (класс root для класса экземпляра)
  3. Я могу повторно использовать существующие объекты и перезаписать их
  4. Тип safe
  5. Синглоты остаются синглонами

Для стандартных типов Java (например, коллекции и т. д.) ), Я использую класс утилиты, который может их скопировать. Методы имеют флаги и обратные вызовы, поэтому я могу контролировать, насколько глубока копия.

58
задан Adrian Sarli 27 July 2009 в 16:09
поделиться

8 ответов

См. strtotime()

strtotime('next tuesday');

Возможно, вы узнали, прошел ли вы прошлый день, посмотрев номер недели:

$nextTuesday = strtotime('next tuesday');
$weekNo = date('W');
$weekNoNextTuesday = date('W', $nextTuesday);

if ($weekNoNextTuesday != $weekNo) {
    //past tuesday
}
102
ответ дан Tom Haigh 26 August 2018 в 06:40
поделиться
  • 1
    Благодаря! Это очень помогает. Мне просто нужно выяснить, как узнать, пришел ли понедельник. Это будет не слишком сложно! Благодаря! – Adrian Sarli 27 July 2009 в 16:19

Извините, я не заметил тег PHP - однако кто-то может быть заинтересован в решении VB:

Module Module1

    Sub Main()
        Dim d As Date = Now
        Dim nextFriday As Date = DateAdd(DateInterval.Weekday, DayOfWeek.Friday - d.DayOfWeek(), Now)
        Console.WriteLine("next friday is " & nextFriday)
        Console.ReadLine()
    End Sub

End Module
4
ответ дан Amal Murali 26 August 2018 в 06:40
поделиться

, если вы хотите найти понедельник, тогда «dayOfWeek» равен 1, если во вторник он будет 2 и т. д.

var date=new Date();
getNextDayOfWeek(date, 2);

// это для поиска следующий вторник

function getNextDayOfWeek(date, dayOfWeek) {
// Code to check that date and dayOfWeek are valid left as an exercise ;)

var resultDate = new Date(date.getTime());

resultDate.setDate(date.getDate() + (7 + dayOfWeek - date.getDay()) % 7);

return resultDate;
}

Надеюсь, это будет полезно для вас, спасибо

1
ответ дан Eann 26 August 2018 в 06:40
поделиться

Вы можете использовать библиотеку Carbon.

Пример: на следующей неделе пятница

Carbon::parse("friday next week");
0
ответ дан Farid Movsumov 26 August 2018 в 06:40
поделиться

Документация PHP для time () показывает пример того, как вы можете получить дату на одну неделю. Вы можете изменить это, чтобы вместо этого перейти в цикл, который выполняет итерацию максимум 7 раз, каждый раз получает временную метку, получает соответствующую дату и получает день недели.

0
ответ дан George Jempty 26 August 2018 в 06:40
поделиться

Вопрос помечен как «php», так как Том сказал, способ сделать это будет выглядеть так:

date('Y-m-d', strtotime('next tuesday'));
22
ответ дан Josh Davis 26 August 2018 в 06:40
поделиться

Если я правильно вас понимаю, вам нужны даты следующих 7 дней?

Вы можете сделать следующее:

for ($i = 0; $i < 7; $i++)  
  echo date('d/m/y', time() + 86400 * $i);

Проверить документацию для функции даты для формат, в котором вы хотите.

2
ответ дан Mike 26 August 2018 в 06:40
поделиться

Я знаю, что это немного поздний ответ, но я хотел бы добавить свой ответ для будущих ссылок.

// Create a new DateTime object
$date = new DateTime();

// Modify the date it contains
$date->modify('next monday');

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

Приятно, что вы также можете делать это с датами, отличными от сегодняшних:

// Create a new DateTime object
$date = new DateTime('2006-05-20');

// Modify the date it contains
$date->modify('next monday');

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

Чтобы сделать диапазон:

$monday = new DateTime('monday');

// clone start date
$endDate = clone $monday;

// Add 7 days to start date
$endDate->modify('+7 days');

// Increase with an interval of one day
$dateInterval = new DateInterval('P1D');

$dateRange = new DatePeriod($monday, $dateInterval, $endDate);

foreach ($dateRange as $day) {
    echo $day->format('Y-m-d')."<br />";
}

Ссылки

Справочник по PHP - DateTime

Руководство PHP - DateInterval

Руководство по PHP - DatePeriod

Руководство по PHP - клон

39
ответ дан user 26 August 2018 в 06:40
поделиться
Другие вопросы по тегам:

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