С vbscript я могу получить двойное значение из текущей даты / времени с помощью команды cdbl(now)
,
Now = '09.05.2015 21:44:10'
cdbl(Now) = 42133,9056712963
Я ищу эквивалентное решение с php, которое вернет мне двойное значение с текущей даты / времени.
cdbl возвращает дату и время в формате Microsoft. до запятой дата — количество дней с 1 января 1900 года. после запятой — 24 часа — 1. Так что если вы используете даты в эпоху Unix (код может быть неэффективным, я хотел бы сделать его более понятным)
function cdbl($str) {
$datetime0 = new DateTime('1970-01-01');
$datetime = new DateTime($str);
// 25560 - days from 1 Jan 1900 to 1 Jan 1970
$cdbl = $datetime->diff($datetime0)->days + 25569;
// Remove time from string - it is the sane as 00:00
$str0 = preg_replace('/((T|\s+).+)$/','', $str);
// The number of seconds since the day start
$time = strtotime($str) - strtotime($str0);
// The number of seconds wittin a day
$timefullday = strtotime("$str0 + 1 day") - strtotime($str0);
$cdbl += $time / $timefullday;
return $cdbl;
}
echo cdbl('09.05.2015 21:44:10');
результат:
42133.905671296
Как видите, существует проблема округления. Если распечатать результат расчета времени до суммирования, ответ будет таким же, как ваш. Я никогда не занимался подсчетом задач, поэтому не могу сказать, что с ним делать. Единственное предложение — конвертировать в строку 🙂
Что ж, если вы решили работать вне дат Unix, вы должны написать код
Следующая функция возвращает текущую метку времени Unix в виде двойного значения:
function cdblnow(){
// time in seconds since 1 Jan 1970 (GMT)
$timeunix = time();
// add the timezone offset
$TimeZone = "Asia/Bangkok";
$dateTimeZone = new DateTimeZone($TimeZone);
$dateTime = new DateTime("now", $dateTimeZone);
$timeOffset = $dateTimeZone->getOffset($dateTime);
$timeunix = $timeunix + $timeOffset;
// determines the days between 1 Jan 1970 and today
$days = intval($timeunix / 86400);
// second count from today
$secondsremains = $timeunix % 86400;
// 25569 days difference between microsoft and unix time stamp start
$now_date = $days + 25569;
// 0.0000115741 represents one second at the cdbl-function from microsoft
$now_time = $secondsremains * 0.0000115741;
return $now_date + $now_time;}
Эта функция возвращает метку времени Unix из двойного числа:
function GetUnixTimeFromCdblNow($cdbl){
$days = intval($cdbl);
$seconds = round($cdbl - $days,9);
$timeunix = (($days -25569) * 86400);
$timeunix = $timeunix + intval($seconds / 0.0000115740);
return $timeunix;}