Получение метки времени unix в миллисекундах в PHP5 и Actionscript3
В Actionscript временная метка Unix в миллисекундах доступна следующим образом:
public static function getTimeStamp():uint
{
var now:Date = new Date();
return now.getTime();
}
В документе четко указано следующее:
getTime(): Число Возвращает количество миллисекунд с полуночи 1 января 1970 года по всемирному времени для объекта Даты.
Когда я отслеживаю его, он возвращает следующее:
824655597
Итак, 824655597 / 1000 / 60 / 60 / 24 / 365 = 0.02 годы. Это явно неверно, так как должно быть около 39 годы.
Вопрос № 1: Что здесь не так?
Теперь перейдем к части PHP: я также пытаюсь получить метку времени в миллисекундах. Функция microtime()
возвращает либо строку (0.29207800 1246365903), либо значение с плавающей точкой (1246365134.01), в зависимости от заданного аргумента. Поскольку я думал, что отметки времени - это просто, я собирался сделать это сам. Но теперь, когда я попробовал и заметил этот поплавок, и объединил это с моими проблемами в Actionscript, я действительно понятия не имею.
Вопрос № 2: как должен ли я сделать так, чтобы он возвращал количество миллисекунд в метке времени Unix?
Временные метки должны быть настолько простыми, что я, вероятно, что-то упускаю.. извини за это. Заранее спасибо.
ПРАВКА1: Сам ответил на первый вопрос. Смотрите ниже.
ПРАВКА2: Я тоже ответил на второй вопрос. Смотреть ниже. Не могу принять ответ в течение 48 часов.
11 answers
Для actionscript3, new Date().getTime()
должно работать.
В PHP вы можете просто вызвать time(), чтобы получить время, прошедшее с 1 января 1970 года 00:00:00 по Гринвичу в секундах. Если вам нужны миллисекунды, просто сделайте (time()*1000)
.
Если вы используете микротайм(), умножьте вторую часть на 1000, чтобы получить миллисекунды. Умножьте первую часть на 1000, чтобы получить миллисекунды, и округлите это. Затем сложите эти два числа вместе. Вуаля.
Я использовал целое число без знака в качестве возвращаемого типа функции. Это должно быть число.
public static function getTimeStamp():Number
{
var now:Date = new Date();
return now.getTime();
}
Думаю, что теперь у меня есть функция для получения миллисекунд в PHP5.
function msTimeStamp() {
return round(microtime(1) * 1000);
}
Для нормализации метки времени в виде целого числа с миллисекундами между Javascript, Actionscript и PHP
Javascript/Actionscript:
function getTimestamp(){
var d = new Date();
return Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()).valueOf();
}
PHP:
function getTimestamp(){
$seconds = microtime(true); // true = float, false = weirdo "0.2342 123456" format
return round( ($seconds * 1000) );
}
См. Примечание PHP в комментарии "бен в sixg dot com" по адресу: http://www.php.net/manual/en/function.gmmktime.php
ВЫДЕРЖКА: Для большинства целей и задач вы можете представить, что mktime() сначала преобразует ваши входные параметры в GMT, а затем вызывает gmmktime(), который создает GMT метка времени.
Таким образом, time() всегда будет возвращать одно и то же в один и тот же фактический момент в любой точке мира.
gmmktime() и mktime(), если заданы конкретные параметры времени, преобразуйте эти параметры времени ИЗ соответствующего часового пояса (GMT для gmmktime(), местное время для mktime()), прежде чем вычислять соответствующую метку времени.
ОБНОВЛЕНИЕ:
В некоторых версиях PHP метка времени с миллисекундами слишком велика для отображения в виде строки. Поэтому используйте функцию sprintf чтобы получить строковое значение:
PHP
function getTimestamp($asString=false){
$seconds = microtime(true); // false = int, true = float
$stamp = round($seconds * 1000);
if($asString == true){
return sprintf('%.0f', $stamp);
} else {
return $stamp;
}
}
Используйте это:
intval(microtime(true)*1000)
Microtime() в php5 возвращает метку времени unix с микросекундами в соответствии с microtime(), и если аргумент get_as_float не указан, он выдает строку в формате "мсек сек", поэтому первая часть - это часть миллисекунды, а вторая - вторая часть. Просто разделите его на две части, и вы получите две части метки времени
Простой ответ для PHP:
function exact_time() {
$t = explode(' ',microtime());
return ($t[0] + $t[1]);
}
Когда вам нужна миллисекунда в формате str, я думаю, вам следует использовать:
public function get_millisecond() {
list($milliPart, $secondPart) = explode(' ', microtime());
$milliPart = substr($milliPart, 2, 3);
return $secondPart . $milliPart;
}
Это исправит ошибку в некотором примере получения миллисекунды, где часть milli выглядит так: 0,056. в каком-то примере преобразуйте часть milli в плавающую, вы получите 56 вместо 056. Я думаю, что кто-то хочет 056.
Особенно когда вам нужна миллисекунда, чтобы упорядочить некоторые данные.
Надеюсь, это поможет.:)
Чтобы получить метку времени в миллисекундах из объекта PHP DateTime:
<?php
date_default_timezone_set('UTC');
$d = new \DateTime('some_data_string');
$mts = $d->getTimestamp().substr($d->format('u'),0,3); // millisecond timestamp
PHP 7 У этой функции объявлен тип возвращаемого значения.
function timestamp_ms(): int {
$times = gettimeofday();
$seconds = strval($times["sec"]);
$milliseconds = strval(floor($times["usec"]/1000));
$missingleadingzeros = 3-strlen($milliseconds);
if($missingleadingzeros >0){
for($i = 0; $i < $missingleadingzeros; $i++){
$milliseconds = '0'.$milliseconds;
}
}
return intval($seconds.$milliseconds);
}
PHP 5
function timestamp_ms() {
$times = gettimeofday();
$seconds = strval($times["sec"]);
$milliseconds = strval(floor($times["usec"]/1000));
$missingleadingzeros = 3-strlen($milliseconds);
if($missingleadingzeros >0){
for($i = 0; $i < $missingleadingzeros; $i++){
$milliseconds = '0'.$milliseconds;
}
}
return intval($seconds.$milliseconds);
}
Что-то вроде этого:
$mili_sec_time = $_SERVER['REQUEST_TIME_FLOAT'] * 1000;
Задает тип с плавающей точкой, представляющий миллисекунды от эпохи UNIX до начала запроса.
$timestamp = str_replace(".","",number_format((float)microtime(true),2,'.',''));