LINUX.ORG.RU
ФорумAdmin

Проблемы с Ruby в OS X

 , ,


0

1

Здравствуйте!

uname -a
Linux ubuntu16 4.4.0-45-generic #66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
ruby -e 'puts Time.mktime(1812,11,16,00,00,00,000000000).to_i'
-4958418617
date --date='@-4958418617'
Пн ноя 16 00:00:00 LMT 1812
date
Чт окт 27 08:30:52 MSK 2016

В то же время:

uname -a
Darwin Air.local 13.4.0 Darwin Kernel Version 13.4.0: Mon Jan 11 18:17:34 PST 2016; root:xnu-2422.115.15~1/RELEASE_X86_64 x86_64
GNU bash, версия 4.4.0(1)-release (x86_64-apple-darwin13.4.0)
ruby --version
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin13
ruby -e 'puts Time.mktime( 1812, 11, 16, 00, 00, 00,   000000000 ).to_i'
-4958420400
date -r -4958420400
Sunday, November 15, 1812 23:30:17 (MMT)
date 
Tuesday, October 25, 2016 6:51:06 (MSK)
НО:
TZ=Europe/Moscow gdate +%s -d"1812-11-16 00:00:00" 
-4958418617 
TZ=Europe/Moscow date -r -4958418617 
понедельник, 16 ноября 1812 г. 00:00:00 (MMT)

Это баг Appe (/usr/share/zoneinfo) или я чего-то не понимаю?

P.S.

Не поделитесь ли фолдером /usr/share/zoneinfo?

Заранее благодарен!

Частное решение:

export TZ=UTC-3 
ruby -e 'puts Time.mktime(1812,11,16,00,00,00,000000000).to_i' 
- 4958420400 
date -r -4958420400 mon, 16 nov 1812 г. 00:00:00 (UTC) 
date 
27 okt 2016 г. 21:14:24 (UTC)


Последнее исправление: Cave-Canem (всего исправлений: 1)

На Windows мне тоже -4958420400 возвращает.
А на Fedora 24 такой же результат, как у тебя на Ubuntu.

Ja-Ja-Hey-Ho ★★★★★
()

Смотри какой тут gmtoff до 1920 года (если у тебя TZ Europe/Moscow в Ubuntu):

> zdump -v /usr/share/zoneinfo/Europe/Moscow 
/usr/share/zoneinfo/Europe/Moscow  Fri Dec 13 20:45:52 1901 UT = Fri Dec 13 23:16:09 1901 MMT isdst=0 gmtoff=9017
/usr/share/zoneinfo/Europe/Moscow  Sat Dec 14 20:45:52 1901 UT = Sat Dec 14 23:16:09 1901 MMT isdst=0 gmtoff=9017
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  2 21:29:42 1916 UT = Sun Jul  2 23:59:59 1916 MMT isdst=0 gmtoff=9017
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  2 21:29:43 1916 UT = Mon Jul  3 00:01:02 1916 MMT isdst=0 gmtoff=9079
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  1 20:28:40 1917 UT = Sun Jul  1 22:59:59 1917 MMT isdst=0 gmtoff=9079
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  1 20:28:41 1917 UT = Mon Jul  2 00:00:00 1917 MST isdst=1 gmtoff=12679
/usr/share/zoneinfo/Europe/Moscow  Thu Dec 27 20:28:40 1917 UT = Thu Dec 27 23:59:59 1917 MST isdst=1 gmtoff=12679
/usr/share/zoneinfo/Europe/Moscow  Thu Dec 27 20:28:41 1917 UT = Thu Dec 27 23:00:00 1917 MMT isdst=0 gmtoff=9079
/usr/share/zoneinfo/Europe/Moscow  Fri May 31 19:28:40 1918 UT = Fri May 31 21:59:59 1918 MMT isdst=0 gmtoff=9079
/usr/share/zoneinfo/Europe/Moscow  Fri May 31 19:28:41 1918 UT = Sat Jun  1 00:00:00 1918 MDST isdst=1 gmtoff=16279
/usr/share/zoneinfo/Europe/Moscow  Sun Sep 15 20:28:40 1918 UT = Mon Sep 16 00:59:59 1918 MDST isdst=1 gmtoff=16279
/usr/share/zoneinfo/Europe/Moscow  Sun Sep 15 20:28:41 1918 UT = Mon Sep 16 00:00:00 1918 MST isdst=1 gmtoff=12679
/usr/share/zoneinfo/Europe/Moscow  Sat May 31 19:28:40 1919 UT = Sat May 31 22:59:59 1919 MST isdst=1 gmtoff=12679
/usr/share/zoneinfo/Europe/Moscow  Sat May 31 19:28:41 1919 UT = Sun Jun  1 00:00:00 1919 MDST isdst=1 gmtoff=16279
/usr/share/zoneinfo/Europe/Moscow  Mon Jun 30 23:59:59 1919 UT = Tue Jul  1 04:31:18 1919 MDST isdst=1 gmtoff=16279
/usr/share/zoneinfo/Europe/Moscow  Tue Jul  1 00:00:00 1919 UT = Tue Jul  1 04:00:00 1919 MSD isdst=1 gmtoff=14400
...

Ja-Ja-Hey-Ho ★★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho
zdump -v /usr/share/zoneinfo/Europe/Moscow
/usr/share/zoneinfo/Europe/Moscow  Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 23:16:09 1901 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 23:16:09 1901 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  2 21:29:42 1916 UTC = Sun Jul  2 23:59:59 1916 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  2 21:29:43 1916 UTC = Mon Jul  3 00:01:02 1916 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  1 20:28:40 1917 UTC = Sun Jul  1 22:59:59 1917 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Sun Jul  1 20:28:41 1917 UTC = Mon Jul  2 00:00:00 1917 MST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Thu Dec 27 20:28:40 1917 UTC = Thu Dec 27 23:59:59 1917 MST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Thu Dec 27 20:28:41 1917 UTC = Thu Dec 27 23:00:00 1917 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Fri May 31 19:28:40 1918 UTC = Fri May 31 21:59:59 1918 MMT isdst=0
/usr/share/zoneinfo/Europe/Moscow  Fri May 31 19:28:41 1918 UTC = Sat Jun  1 00:00:00 1918 MDST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Sun Sep 15 20:28:40 1918 UTC = Mon Sep 16 00:59:59 1918 MDST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Sun Sep 15 20:28:41 1918 UTC = Mon Sep 16 00:00:00 1918 MST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Sat May 31 19:28:40 1919 UTC = Sat May 31 22:59:59 1919 MST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Sat May 31 19:28:41 1919 UTC = Sun Jun  1 00:00:00 1919 MDST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Mon Jun 30 21:28:40 1919 UTC = Tue Jul  1 01:59:59 1919 MDST isdst=1
/usr/share/zoneinfo/Europe/Moscow  Mon Jun 30 21:28:41 1919 UTC = Tue Jul  1 01:28:41 1919 MSD isdst=1
/usr/share/zoneinfo/Europe/Moscow  Fri Aug 15 19:59:59 1919 UTC = Fri Aug 15 23:59:59 1919 MSD isdst=1
/usr/share/zoneinfo/Europe/Moscow  Fri Aug 15 20:00:00 1919 UTC = Fri Aug 15 23:00:00 1919 MSK isdst=0
/usr/share/zoneinfo/Europe/Moscow  Mon Feb 14 19:59:59 1921 UTC = Mon Feb 14 22:59:59 1921 MSK isdst=0

gmtoff вовсе нет

Cave-Canem
() автор топика
27 декабря 2016 г.
Ответ на: комментарий от Ja-Ja-Hey-Ho

gmtoff

> zdump -v /usr/share/zoneinfo/Europe/Moscow | head -n 1
/usr/share/zoneinfo/Europe/Moscow  Fri Dec 13 20:45:52 1901 UT = Fri Dec 13 23:16:09 1901 MMT isdst=0 gmtoff=9017

gmtoff=(time MMT) - (time UT) в секундах — (23:16:09)-(20:45:52)=2:30:17=9017, 20:45:52 — нижняя граница для 32 битного со знаком представления времени

Cave-Canem
() автор топика

Разобрался, по-моему БАГ в Ruby!

Итак:

ruby -e 'puts Time.utc( 1812, 11, 16, 0, 0, 0, 0 ).to_i'      #UTC Time
-4958409600
ruby -e 'puts Time.local( 1812, 11, 16, 0, 0, 0, 0 ).to_i'    #Local Time UTC+3
-4958420400
ruby -e 'puts Time.mktime( 1812, 11, 16, 0, 0, 0, 0 ).to_i'   #Local Time UTC+3
-4958420400
gdate +%s -d"1812-11-16  00:00:00"                      #!!! Local Time MMT, (UTC+2,50472222222222)
-4958418617
gdate -u +%s -d"1812-11-16  00:00:00"                   #UTC Time
-4958409600
date -ur -4958409600
понедельник, 16 ноября 1812 г. 00:00:00 (UTC)           #UTC Time
date -r -4958418617
понедельник, 16 ноября 1812 г. 00:00:00 (MMT)           #!!! Local Time MMT (UTC+2,50472222222222)
date -r -4958420400
воскресенье, 15 ноября 1812 г. 23:30:17 (MMT)
ruby -e 'puts Time.at(-4958420400).to_s' 
1812-11-16 00:00:00 +0300                               #!!!!!!!!!!!!!!!!!!!! Local Time UTC+3
ruby -e 'puts Time.local( 1901, 12, 13, 23, 16, 9 ).to_i'      #!!! Local Time UTC+0230
-2147483648
ruby -e 'puts Time.at(-2147483648).to_s' 
1901-12-13 23:16:09 +0230                                #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
date -r -2147483648
пятница, 13 декабря 1901 г. 23:16:09 (MMT)
Иначе говоря, ruby почему-то предполагает что для дат меньших чем указано в /usr/share/zoneinfo/Europe/Moscow gmtoff=10800 (т.е. использует ТЕКУЩЕЕ значение), а date (и gdate) — что gmtoff=9017, что правильнее.

Мо-моему, это БАГ в ruby!

Cave-Canem
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.