Как получить время модификации файла в GMT?

melbis

Новичок
Как получить время модификации файла в GMT?

Как получить время модификации файла в GMT?

знаем функцию filemtime, но она возвращет время как и mktime у четом локальной зоны...

а вот функция gmmktime возвращает время по грину, вот если бы была фунция gmgilemtime :)

но такой нет... поэтому вопрос как красиво и просто (без преобразования в string и обратно) получить время файла по грину?

P.S.
gmdate("U", filemtime('...')) - не предлагать, не правильно
filemtime('...') + date("Z") - не предлагать, тоже не правильно
 

mani13

Новичок
начнём с:
php > echo date('Y-m-d H:i:s', 1000000000);
2001-09-09 05:46:40
php > echo gmdate('Y-m-d H:i:s', 1000000000);
2001-09-09 01:46:40
потом:
php > echo time();
1131551586
php > touch('test');
php > echo filemtime('test');
1131551592
php > echo date('Y-m-d H:i:s', filemtime('test'));
2005-11-09 18:53:12
php > echo gmdate('Y-m-d H:i:s', filemtime('test'));
2005-11-09 15:53:12

собственно, я про то, что timestamp существует независимо от особенностей региона, а эти самые особенности применяются на выводе...
 

melbis

Новичок
не клеится так :(
1) 2001-09-09 05:46:40 и 2001-09-09 01:46:40 - разница 4 час

2) 2005-11-09 18:53:12 - 2005-11-09 15:53:12 - разница 3 час

а вообще мне надо именно в юнихтаимстамп, попробуйте сами получится что:

gmdate('U', filemtime('test')) = filemtime('test')

-~{}~ 09.11.05 18:10:

собственно, я про то, что timestamp существует независимо от особенностей региона, а эти самые особенности применяются на выводе...
а вот и нет, зависит поэтому то и есть mktime и gmmktime

а filemtime выдает время с учетом врем.зоны

а date("Z") пишет зону с учетом летнего/зимнего времени!
 

mani13

Новичок
1. всё клеится(летнее/зимнее время + 3 часа)
2. filemtime выдаёт timestamp
3. mktime и gmmktime как раз созданы для того, чтобы в 1 случае учитывать временную зону, а в другом -- нет
4. если timestamp зависит от временной зоны, то почему нет gmtime?
 

melbis

Новичок
вот я читаю как в доке написано:

mktime -- Возвращает метку времени для заданной даты
gmmktime -- Возвращает метку времени Unix для времени по Гринвичу

от куда видно что расчетный timestamp будет разный...

вообще же хотелось бы все-таки услышать ваше решение на все тот же вопрос: "Как получить метку времени Unix (timestamp) для времени по Гринвичу модификации файла?"
 

mani13

Новичок
filemtime...
в доке всё правильно написано, просто вы неправильно понимаете...
 

SiMM

Новичок
melbis, Вам же mani13 сказал
> 1) 2001-09-09 05:46:40 и 2001-09-09 01:46:40 - разница 4 час
летнее время
> 2) 2005-11-09 18:53:12 - 2005-11-09 15:53:12 - разница 3 час
зимнее время
 

melbis

Новичок
Автор оригинала: SiMM
melbis, Вам же mani13 сказал
> 1) 2001-09-09 05:46:40 и 2001-09-09 01:46:40 - разница 4 час
летнее время
> 2) 2005-11-09 18:53:12 - 2005-11-09 15:53:12 - разница 3 час
зимнее время
С этим я уже понял, спасибо...

-~{}~ 09.11.05 19:45:

Автор оригинала: mani13
filemtime...
в доке всё правильно написано, просто вы неправильно понимаете...
filemtime выдает разные числа, когда я меняю часовой пояс на компьютере для одного и того же файла, поэтому то я и хочу получить такой timestamp который не будет меняться в зависимости от установленного часового пояса...

К примеру: результат функции mktime тоже меняется, когда я на компе меняю часовой пояс, а вот когда я использую gmmktime, то независимо от часового пояса получаю одно и тоже время.
 

Profic

just Profic (PHP5 BetaTeam)
filemtime выдает разные числа, когда я меняю часовой пояс на компьютере для одного и того же файла
Все правильно, в самой fs данные хранятся не в GMT, а в локальном времени, вот ОС и производит поправки.
 

mani13

Новичок
Profic
в общем, от ФС зависит или от реализации в ядре...
Код:
# ln -s ../usr/share/zoneinfo/Europe/London localtime
# /etc/init.d/clock restart
...
# php -a
Interactive mode enabled

php > echo date('Y-m-d H:i:s T');
2005-11-09 22:21:25 GMT
php > echo date('Y-m-d H:i:s T U', filemtime('/home/snapshots/portage-20051108.tar.bz2'));
2005-11-08 19:31:36 GMT 1131478296
php > exit
# unlink localtime
# ln -s ../usr/share/zoneinfo/Europe/Moscow localtime
# /etc/init.d/clock restart
...
# php -a
Interactive mode enabled

php > echo date('Y-m-d H:i:s T');
2005-11-09 22:21:57 MSK
php > echo date('Y-m-d H:i:s T U', filemtime('/home/snapshots/portage-20051108.tar.bz2'));
2005-11-08 22:31:36 MSK 1131478296
php > exit
 

melbis

Новичок
ок, тогда посоветуйте, пожалуйста, как быть в такой ситуации:

вот скрипт:

<?

echo ' date("Z"): '.date("Z").'<br>';

touch("test.txt", mktime(12, 6, 6, 5, 26, 2005));

echo ' filemtime("test.txt"): '.filemtime("test.txt").'<br>';


?>

Вот как он работает на двух серверах с разными часовыми поясами:

1) http://www.melbis.com/1/tst.php
date("Z"): 0
filemtime("test.txt"): 1117109166

2) http://sportik.ru/1/tst.php
date("Z"): 10800
filemtime("test.txt"): 1117094766

таким образом, как же мне все-таки вычислить время последней модификации файла в timestamp?

P.S.
При просмотре по ftp время файла одинаковое на обоих серверах...
 

mani13

Новичок
а ничего, что mktime(12, 6, 6, 5, 26, 2005)
в разных часовых поясах будет выдавать разный timestamp?
 

melbis

Новичок
Решение нашел сам... ;)

Для того чтобы получить время модификации файла по Гринвичу независимо от локальных установок сервера (часового пояса) и зимнего/летнего времени, надо сделать так:

filemtime("test.txt")+date("Z", filemtime("test.txt"))

:)

спасибо всем, кто пытался помочь!

-~{}~ 09.11.05 20:55:

Автор оригинала: mani13
а ничего, что mktime(12, 6, 6, 5, 26, 2005)
в разных часовых поясах будет выдавать разный timestamp?
ничего, я специально написал, что по фтп у всех файлов время получается одинаковое...
 

mani13

Новичок
melbis
а теперь финт ушами:
php > date_default_timezone_set('GMT');
php > echo date('Y-m-d H:i:s Z', 1117109166);
2005-05-26 12:06:06 0
php > date_default_timezone_set('Europe/Moscow');
php > echo date('Y-m-d H:i:s Z', 1117094766);
2005-05-26 12:06:06 14400
локальная дата одна :)
а почему фтп отдаёт локальное время -- фих его знает
 

melbis

Новичок
то что конструкция типа:

date('Y-m-d H:i:s', filemtime(...))

будет давать один и тот же результатах на всех серверах, независимо от часового пояса -- это ясно, в этом вопроса не было!!! Нужен был - timestamp по грину, а не 'Y-m-d H:i:s'!
 

mani13

Новичок
ладно, ещё раз:
timestamp -- количество секунд прошедних с 01.01.1970 00:00:00 GMT
если есть сомнения в GMT --
php > echo date_default_timezone_get();
Europe/Moscow
php > echo date('Y-m-d H:i:s', 0);
1970-01-01 03:00:00
php > date_default_timezone_set('GMT');
php > echo date('Y-m-d H:i:s', 0);
1970-01-01 00:00:00
так что timestamp не "по грину" абсурден
 
Сверху