. * * @link https://www.librenms.org * * @copyright 2018 Tony Murray * @author Tony Murray */ namespace LibreNMS\Util; class Time { public static function legacyTimeSpecToSecs($description) { $conversion = [ 'now' => 0, 'onehour' => 3600, 'fourhour' => 14400, 'sixhour' => 21600, 'twelvehour' => 43200, 'day' => 86400, 'twoday' => 172800, 'week' => 604800, 'twoweek' => 1209600, 'month' => 2678400, 'twomonth' => 5356800, 'threemonth' => 8035200, 'year' => 31536000, 'twoyear' => 63072000, ]; return isset($conversion[$description]) ? $conversion[$description] : 0; } public static function formatInterval($interval, $format = 'long') { $result = ''; $data = [ 'years' => 31536000, 'days' => 86400, 'hours' => 3600, 'minutes' => 60, 'seconds' => 1, ]; foreach ($data as $k => $v) { if ($interval >= $v) { $diff = floor($interval / $v); $result .= " $diff"; if ($format == 'short') { $result .= substr($k, 0, 1); } if ($format != 'short' && $diff > 1) { $result .= ' ' . $k; } if ($format != 'short' && $diff < 2) { $result .= ' ' . substr($k, 0, -1); } $interval -= $v * $diff; } } return $result; } /* * @param integer seconds of a time period * @return string human readably time period */ public static function humanTime($s) { $ret = []; if ($s >= 86400) { $d = floor($s / 86400); $s -= $d * 86400; if ($d == 1) { $ret[] = $d . ' day'; } else { $ret[] = $d . ' days'; } } if ($s >= 3600) { $h = floor($s / 3600); $s -= $h * 3600; if ($h == 1) { $ret[] = $h . ' hour'; } else { $ret[] = $h . ' hours'; } } if ($s >= 60) { $m = floor($s / 60); $s -= $m * 60; if ($m == 1) { $ret[] = $m . ' minute'; } else { $ret[] = $m . ' minutes'; } } if ($s > 0) { if ($s == 1) { $ret[] = $s . ' second'; } else { $ret[] = $s . ' seconds'; } } return implode(' ,', $ret); } /** * Parse a time string into a timestamp including signed relative times using: * m - month * d - day * h - hour * y - year */ public static function parseAt(string|int $time): int { if (is_numeric($time)) { return $time < 0 ? time() + $time : intval($time); } if (preg_match('/^[+-]\d+[hdmy]$/', $time)) { $units = [ 'm' => 60, 'h' => 3600, 'd' => 86400, 'y' => 31557600, ]; $value = Number::cast(substr($time, 1, -1)); $unit = substr($time, -1); $offset = ($time[0] == '-' ? -1 : 1) * $units[$unit] * $value; return time() + $offset; } return (int) strtotime($time); } }