是否有任何庫或準備使用函式來輕松計算 PHP 中的時間戳?
我需要得到:
- unixtimestamp:當前季度的第一秒,
- unixtimestamp:當前季度的最后一秒,
- unixtimestamp:上一季度的第一秒,
- unixtimestamp:上一季度的最后一秒,
問題:
- 時區,
- 示例 3) 和 4) 中的年初
你是怎么計算的?我的代碼看起來很復雜...
uj5u.com熱心網友回復:
我給了 DateTime 一個機會,并試圖讓它更容易擴展:
function getQuarterTimestamp(string $timestamp, string $returnTimestamp) : int {
// Offset to start of current quarter
$currentMonthQuarterOffset = - (date('n') 2) % 3;
switch($timestamp) {
case 'current':
break;
case 'previous':
$currentMonthQuarterOffset -= 3; // Move back 1 quarter
break;
default:
throw new InvalidArgumentException("Bad timestamp argument");
break;
}
switch($returnTimestamp) {
case 'start':
$dayOffset = 'first';
$timeOffset = '00:00:00';
break;
case 'end':
$currentMonthQuarterOffset = 2; // Default is start, move to end of quarter
$dayOffset = 'last';
$timeOffset = '23:59:59';
break;
default:
throw new InvalidArgumentException("Bad returnTimestamp argument");
break;
}
$dateTimeStr = "{$dayOffset} day of {$currentMonthQuarterOffset} month {$timeOffset}";
return (new DateTime($dateTimeStr))->getTimeStamp();
}
uj5u.com熱心網友回復:
我為你寫了一個函式。
function getTimestampFromQuarter(string $quarterName = 'current', string $returnTimestamp = 'start', string $timezone = 'UTC', int $year = null): int {
$dt = new DateTime();
$dt->setTimezone(new DateTimeZone($timezone));
// if year not defined, we use current year
$year = $year ?? date('Y');
// current month
$month = date("n");
// current quarter number
$quarter = ceil($month / 3);
// we are looking for previous quarter
if (in_array(strtolower($quarterName), ['previous','last'])) {
$quarter--;
if (0 == $quarter) {
$quarter = 4;
$year--;
}
}
// we are looking for next quarter
elseif (in_array(strtolower($quarterName), ['next'])) {
$quarter ;
if (4 == $quarter) {
$quarter = 1;
$year ;
}
}
$quarterFirstMonth = (12 / 4) * ($quarter - 1) 1; // first month of quarter
$quarterLastMonth = (12 / 4) * ($quarter - 1) 3; // last month of quarter
if ('start'==$returnTimestamp) {
$dt->setDate($year, $quarterFirstMonth, 1);
$dt->setTime(0, 0, 0);
}
elseif ('end'==$returnTimestamp) {
// looking for month days count
$ts = new DateTime();
$ts->setDate($year, $quarterLastMonth, 1);
$ts->setTimezone(new DateTimeZone($timezone));
$day = date('t', $ts->getTimestamp());
unset($ts);
$dt->setDate($year, $quarterLastMonth, $day);
$dt->setTime(23, 59, 59);
}
return $dt->getTimestamp();
}
使用很簡單:
1..本季度的第一秒:
echo getTimestampFromQuarter('current', 'start');
// output: 1633046400 (equals to Friday 1. October 2021 0:00:00)
2.. 本季度的最后一秒:
echo getTimestampFromQuarter('current', 'end');
// output: 1640995199 (equals to Friday 31. December 2021 23:59:59)
3.. 上一季度的第一秒:
echo getTimestampFromQuarter('previous', 'start');
// output: 1625097600 (equals to Thursday 1. July 2021 0:00:00)
4.. 上一季度的最后一秒:
echo getTimestampFromQuarter('previous', 'end');
// output: 1633046399 (equals to Thursday 30. September 2021 23:59:59)
5.. 下個季度的第一秒:
echo getTimestampFromQuarter('next', 'start');
// output: 1640995200 (equals to Saturday 1. January 2022 0:00:00)
6.. 下個季度的最后一秒:
echo getTimestampFromQuarter('next', 'end');
// output: 1648771199 (equals to Thursday 31. March 2022 23:59:59)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368190.html
上一篇:Java-我如何將日期作為輸入并能夠添加/減去它的天/月/年
下一篇:Git拉入GitHub作為合作者
