首页 > 解决方案 > 从睡眠/唤醒标记数组中获取平均清醒时间

问题描述

我一直在绞尽脑汁想弄清楚这件事……

我需要AwakeDuration进入以下数组。

Array
(
    [0] => Array
        (
            [WentToSleep] => 2019-07-24 15:45:00
            [WokeUp] => 2019-07-24 22:10:00
            [SleepDuration] => 6:25
        )

    [1] => Array
        (
            [WentToSleep] => 2019-07-23 15:25:00
            [WokeUp] => 2019-07-23 23:00:00
            [SleepDuration] => 7:35
        )

    [2] => Array
        (
            [WentToSleep] => 2019-07-22 12:45:00
            [WokeUp] => 2019-07-22 23:00:00
            [SleepDuration] => 10:15
        )

    [3] => Array
        (
            [WentToSleep] => 2019-07-21 13:00:00
            [WokeUp] => 2019-07-21 21:00:00
            [SleepDuration] => 8:00
        )

    [4] => Array
        (
            [WentToSleep] => 2019-07-20 11:10:00
            [WokeUp] => 2019-07-20 20:00:00
            [SleepDuration] => 8:50
        )

    [5] => Array
        (
            [WentToSleep] => 2019-07-19 09:00:00
            [WokeUp] => 2019-07-19 16:30:00
            [SleepDuration] => 7:30
        )

    [6] => Array
        (
            [WentToSleep] => 2019-07-18 06:00:00
            [WokeUp] => 2019-07-18 14:05:00
            [SleepDuration] => 8:05
        )

    [7] => Array
        (
            [WentToSleep] => 2019-07-17 05:15:00
            [WokeUp] => 2019-07-17 13:30:00
            [SleepDuration] => 8:15
        )
)

这来自以下代码:

$json = '[{"Sleep":"2019-07-24 15:45:00","Wake":"2019-07-24 22:10:00"},{"Sleep":"2019-07-23 15:25:00","Wake":"2019-07-23 23:00:00"},{"Sleep":"2019-07-22 12:45:00","Wake":"2019-07-22 23:00:00"},{"Sleep":"2019-07-21 13:00:00","Wake":"2019-07-21 21:00:00"},{"Sleep":"2019-07-20 11:10:00","Wake":"2019-07-20 20:00:00"},{"Sleep":"2019-07-19 09:00:00","Wake":"2019-07-19 16:30:00"},{"Sleep":"2019-07-18 06:00:00","Wake":"2019-07-18 14:05:00"},{"Sleep":"2019-07-17 05:15:00","Wake":"2019-07-17 13:30:00"}]';

$SleepWakeArray = json_decode($json, true);

foreach ($SleepWakeArray AS $results) {

    $SleepDiff = (new DateTime($results['Sleep']))->diff(new DateTime($results['Wake']));
    $SleepDuration = $SleepDiff>h . ':' . str_pad($SleepDiff>i,2,'0',STR_PAD_LEFT);

    $array[] = [
        'WentToSleep' => $results['Sleep'],
        'WokeUp' => $results['Wake'],
        'SleepDuration' => $SleepDuration,
    ];

}

我无法弄清楚的是如何计算一个新值,AwakeDuration就像人们所说的那样。

所以,我想我需要使用醒来的时间[1][Wake] (例如)和最近睡觉的时间[0][Sleep]

diff()然后做[1][Wake]一个[0][Sleep]

所以类似这样的事情......

$WentToSleep = new DateTime('2019-07-24 15:45:00');  // `[0][Sleep]`
$WokeUp = new DateTime('2019-07-23 23:00:00'); // `[1][Wake]`
$Diff = $WentToSleep->diff($WokeUp);
$Duration = $Diff->h . ':' . str_pad($Diff->i,2,'0',STR_PAD_LEFT);

但是如何在代码中计算出这种逻辑,今天让我脑筋急转弯,希望有人能帮助我。

标签: phpdatetime

解决方案


这是一种集体休息。

您循环排序数据(强制性!)。记住使用变量的下一次调用的最后“唤醒”时间(init with null)。当它不为null时,进行计算(第一个条目不能有它,只有你预设了'wokeup')。用当前的更新“唤醒”。

$wokeup = null;
foreach( ... as $data) {
    if (null !== $wokeup) {                    
        // calculate wake time "last wake" till "current sleep"
    }
    // update last woke up
    $wokeup = $data['wake'];
}

推荐阅读