PHP дата - Unix отметка времени - PullRequest
3 голосов
/ 15 января 2020

Может кто-нибудь помочь мне решить эту загадку PHP timestamp

Я пытаюсь найти число будних дней на основе двух данных дат.

Я получаю строковую дату например, начальная дата: 01/10/2019 (1 октября 2019 г.) и разнесение ее в массив => $ s

Массив $ s установлен так:

Array ( [0] => 01 [1] => 10 [2] => 2019 )

тогда я сделал Unix отметка времени от него:

date('U', mktime(0, 0, 0, $s[1], $s[0], $s[2]));

Я получаю 1569884400 в результате преобразования даты выше.

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

это результат того l oop и как видите почему-то повторяется 27 октября.

Просто чтобы уточнить верх этой PHP страницы, у меня установлен часовой пояс

date_default_timezone_set('Europe/London');

Это код, показанный ниже:

всего $ total_days на основе последнего дата (в данном случае 31 октября 2019 года и ie: 31 день)

октября 2019 года должно быть 23 рабочих дня, так как я получу 2x 27 октября, я получу только 22 рабочих дня.

Что я здесь не так делаю?

 $wk_days = array(1, 2, 3, 4, 5);
  $days = 0;
  for ($i = 0; $i < $total_days; $i++) {
    $tmp = $first + ($i * 86400);
    echo  $i." x86400 add to ". $first . " ==> " . $tmp. " and the new date is "  .date('Y-m-d',$tmp) ."<br/>";

    $chk = date('w', $tmp);

    if (in_array($chk, $wk_days)) {
      $days++;
    }
  }

0 x86400 добавить к 1569884400 ==> 1569884400 и новой датой будет 2019-10-01

1 x86400 добавить к 1569884400 ==> 1569970800 и новой дате это 2019-10-02

2 x86400 добавление к 1569884400 ==> 1570057200 и новая дата 2019-10-03

3 x86400 добавление к 1569884400 ==> 1570143600 и новая дата это 2019-10-04

4 x86400 добавить к 1569884400 ==> 1570230000 и новая дата 2019-10-05

...

23 x86400 добавить к 1569884400 ==> 1571871600 с новой датой 2019-10-24

24 x86400 добавьте к 1569884400 ==> 1571958000 и новой датой 2019-10-25

25 x86400 добавьте к 1569884400 ==> 1572044400 с новой датой 2019-10-26

26 x86400 добавьте к 1569884400 ==> 1572130800 и новой датой 2019-10-27 // ***

27 x86400 добавить к 1569884400 ==> 1572217200 и новой датой будет 2019-10-27 // ***

28 x86400 добавить к 1569884400 ==> 1572303600 и новой датой будет 2019-10-28

29 х 86400 добавить к 1569884400 ==> 1572390000, и новая дата будет 2019-10-29

30 x86400, добавить к 1569884400 ==> 1572476400, а новая дата будет 2019-10-30

Ответы [ 4 ]

2 голосов
/ 15 января 2020

Вам не нужно ничего сложного. Вы можете иметь простое время l oop и считать дни недели. Возможно, это не самый эффективный способ сделать это, но он должен работать.

function getNoOfWeekdays(string $startdate, string $enddate, string $format = 'd/m/Y'): int
{
    $start = date_create_from_format($format, $startdate);
    $end = date_create_from_format($format, $enddate);

    $count = 0;
    while ($start <= $end) {
        if ($start->format('N') < 6) $count++;
        $start->modify('+1 days');
    }

    return $count;
}
1 голос
/ 15 января 2020

Может быть, вы могли бы попробовать с этим кодом:

  $initial = "2019-10-01";
  $last = "2019-10-31";
  $wk_days = array(1, 2, 3, 4, 5);
  $days = 0;
  $date = $initial;
  do{

    $chk = date("w",strtotime($date));
    if(in_array($chk,$wk_days))
      $days++;
    $date = date("Y-m-d",strtotime("$date +1 day"));

  }while($date!=date("Y-m-d",strtotime("$last +1 day")));
    echo $days;
?>
1 голос
/ 15 января 2020

Я создал расширение PHP для DateTime API, которое называется dt. Вы можете найти это здесь . Использовать его очень просто:

$start = '2019-10-01';
$end = '2019-11-01'; 

$start = dt::create($start);

//exclude end with true as 3.parameter
$countWeekdaysOct2019 = $start->countDaysTo('1,2,3,4,5',$end, true); //23

$countSundaysOct2019 = $start->countDaysTo('0',$end, true); //4

$countSaturdaysOct2019 = $start->countDaysTo('6',$end, true); //4
1 голос
/ 15 января 2020

Попробуйте (см. Мой комментарий выше), чтобы избежать проблемы перехода с летнего на зимнее время:

$first = date('U', mktime(12 /* 12 pm!! */, 0, 0, $s[1], $s[0], $s[2]));
//
// some code here that the author didn't show and we hardly can extrapolate
// ...
//
$wk_days = array(1, 2, 3, 4, 5);
  $days = 0;
  for ($i = 0; $i < $total_days; $i++) {
    $tmp = $first + ($i * 86400);
    echo  $i." x86400 add to ". $first . " ==> " . $tmp. " and the new date is "  .date('Y-m-d',$tmp) ."<br/>";

    $chk = date('w', $tmp);

    if (in_array($chk, $wk_days)) {
      $days++;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...