Календарь ЗЛ

  Всего сообщений: 261
Для печати
Автор Сообщение
lvbnhbq
 Написано: 27.08.2012, 19:03  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Ray писал(a):

[изображение] [изображение] [изображение]
В начало страницы
Ray
 Написано: 27.08.2012, 19:04  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
Дим, рано радуешься :D
Грят, неправильно считает :wall:
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 19:10  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Ray писал(a):
Дим, рано радуешься :D
Грят, неправильно считает :wall:

Н-да, поторопился! :pardon: Недопер подставить изветные даты. Посчитал ту, которая нужна мне, получилось похоже. Вот и обрадовался.
То, что заметил: 1973 год не воспринимает в принципе, хотя 01/01/1974 выдает шестой день восьмой месяц первого года.
В начало страницы
Ray
 Написано: 27.08.2012, 19:11  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
lvbnhbq писал(a):
То, что заметил: 1973 год не воспринимает в принципе, хотя 01/01/1974 выдает восьмой месяц первого года.

Да, год меньше 1973 не принимается, и еще проверки правильности введенной даты нет. Это чтобы не заморачиваться с отловом нулевой даты.
Оно так нужно - этот нулевой год?
В начало страницы
Ray
 Написано: 27.08.2012, 19:16  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
Давайте новый пример рассматривать. По строкам.

Вводим:
CurrentDay = 22;
CurrentMon = 8;
CurrentYear = 2012;
CurrentHrs = 13;
CurrentMins = 0;

Константы:
Hr = 60;
NWDay = 29*Hr+72; // = 1812
NWMon = 40 * NWDay; // = 72480
NWYear = 11 * NWMon; // = 797280
OWDay = 24*60; // = 1440 продолжительность староземельного дня в минутах.

Считаем:
DeltaOldWorld_days = div ( ( mktime(CurrentHrs, CurrentMins, 0,CurrentMon,CurrentDay,CurrentYear) - mktime(0, 0, 0,1,6,1973) ) , (60*60*24) );

Delta = DeltaOldWorld_days * OWDay + (CurrentHrs - 12) * Hr + CurrentMins - 24; //** точное количество минут с День1 00:00 **//

NewWorldYear = div( Delta, NWYear ) + 1;

DeltaYear = mod( Delta, NWYear );

NewWorldMon = div(DeltaYear, NWMon) + 1; //** полные новоземельные месяцы **//

DeltaMon = mod(DeltaYear, NWMon); //** остаток (в минутах) от дельты после вычитания месяцев **//

NewWorldDay = div(DeltaMon, NWDay) + 1; //** полные новоземельные дни **//

DeltaDay = mod(DeltaMon, NWDay); //** остаток (в минутах) от дельты после вычитания дней **//

NewWorldHrs = div(DeltaDay, Hr); //** полные новоземельные часы **//

NewWorldMins = mod(DeltaDay, Hr); //** оставшиеся новоземельные минуты **//


NewDayOfWeek = mod( (1+NewWorldDay+40*(NewWorldMon-1)+440*(NewWorldYear-1)),7);
В начало страницы
vovaz02h
 Написано: 27.08.2012, 19:21  

технонанонекрофил - милитарист


Регистрация: 21.03.2012
Сообщений: 4707
Откуда: З нашого боку порєбріка.
Имя: Владимир
Ray писал(a):
DeltaOldWorld_days = div ( ( mktime(CurrentHrs, CurrentMins, 0,CurrentMon,CurrentDay,CurrentYear) - mktime(0, 0, 0,1,6,1973) ) , (60*60*24) );
ну так, только чтобы убедиться -
mktime оперирует секундами?
Вообще куда смотреть? Реализация этого всего на PHP?
В начало страницы
Ray
 Написано: 27.08.2012, 19:27  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
vovaz02h писал(a):
mktime оперирует секундами?

Да. Количество секунд с 01-01-1970 00:00:00

Цитата:
Вообще куда смотреть? Реализация этого всего на PHP?

Да.
В начало страницы
vovaz02h
 Написано: 27.08.2012, 19:34  

технонанонекрофил - милитарист


Регистрация: 21.03.2012
Сообщений: 4707
Откуда: З нашого боку порєбріка.
Имя: Владимир
И, кстати, тут же еще один подводный камень...
Получая разницу в сутках между двумя датами старого календаря простой разницей количества секунд (при пересечении даты "29 февраля"), учитывается ли при этом високосность? IMHO нет.
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 19:42  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Цитата:
int mktime ([int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])

Аргумент is_dst может быть установлен в 1, если заданной дате соответствует летнее время, 0 в противном случае, или -1 (значение по умолчанию), если неизвестно, действует ли летнеее время на заданную дату. В последнем случае PHP пытается определить это самостоятельно. Это можно привести к неожиданному результату (который, тем не менее, не будет неверным).

vovaz02h писал(a):
И, кстати, тут же еще один подводный камень...
Получая разницу в сутках между двумя датами старого календаря простой разницей количества секунд (при пересечении даты "29 февраля"), учитывается ли при этом високосность? IMHO нет.
А разве не все стандартные функции даты/времени понимают этот момент?
В начало страницы
DStaritsky
 Написано: 27.08.2012, 19:54  

космический ватник


Регистрация: 09.04.2012
Сообщений: 19944
Откуда: Росиия Москва
Имя: Дмитрий Старицкий
Ray писал(a):

класс. автоматика руллиз!!! :good:

можно уже кнопку новую вводить для удобства за Библиотекой на верху.
В начало страницы
vovaz02h
 Написано: 27.08.2012, 19:57  

технонанонекрофил - милитарист


Регистрация: 21.03.2012
Сообщений: 4707
Откуда: З нашого боку порєбріка.
Имя: Владимир
lvbnhbq писал(a):
А разве не все стандартные функции даты/времени понимают этот момент?
:xz: Максимум моих программистских потуг по работе со временем приходится на скрипты по разборке больших логов на кучки маленьких. Там это не критично было.
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 19:59  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Насколько еще шевелятся в мозгЕ остатки знаний, мне не очень понравилась вот эта строчка "DeltaOldWorld_days = div ( ( mktime(CurrentHrs, CurrentMins, 0,CurrentMon,CurrentDay,CurrentYear) - mktime(0, 0, 0,1,6,1973) ) , (60*60*24) );", а именно отбрасывание дробной части. Не может это дать накопление ошибки?
В начало страницы
Kail Itorr
 Написано: 27.08.2012, 20:04  

Автор


Регистрация: 26.04.2012
Сообщений: 11696
Откуда: Киев, Украина
Имя: Кайл Иторр
Рассматриваю эталонный пример 18/06/2005 12:00 - должно конвертироваться в 19/5/22 11:00

Hr = 60;
NWDay = 29*Hr+72; // = 1812
NWMon = 40 * NWDay; // = 72480
NWYear = 11 * NWMon; // = 797280
OWDay = 24*60; // = 1440

DeltaOldWorld_days = 18/06/2005 - 6/1/1973 = 11851
Delta = 11851 * 1440 + (12-12)*60 + 0-24 = 17065416

NewWorldYear = (Delta div NWYear) + 1 = 17065416 div 797280 + 1 = 22
DeltaYear = Delta mod NWYear = 17065416 mod 797280 = 322536

NewWorldMon = (DeltaYear div NWMon) + 1 = 322536 div 72480 + 1 = 5
DeltaMon = DeltaYear mod NWMon = 322536 mod 72480 = 32616

NewWorldDay = (DeltaMon div NWDay) + 1 = 32616 div 1812 + 1 = 19
DeltaDay = DeltaMon mod NWDay = 32616 mod 1812 = 0
А вот и вылезла ошибка: здесь должно быть 11 часов ровно, т.е. 660.
Значит, в исходной формуле неправильно определено ВРЕМЯ начала отсчета (т.е. День1 - правильно, а вот Час1-Мин1 - нет), и нужно перевести соотв. стрелки на 11 часов вперед.

Т.е. Delta = DeltaOldWorld_days * OWDay + (CurrentHrs - 1) * Hr + CurrentMins - 24

Скомпилируй этот вариант, тогда мы чего-то будем иметь...
В начало страницы
Ray
 Написано: 27.08.2012, 20:10  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
Kail Itorr писал(a):
Рассматриваю эталонный пример 18/06/2005 12:00 - должно конвертироваться в 19/5/22 11:00

Т.е. Delta = DeltaOldWorld_days * OWDay + (CurrentHrs - 1) * Hr + CurrentMins - 24

Скомпилируй этот вариант, тогда мы чего-то будем иметь...

Сделал. Получается 18-05-22 29:12, четверг
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 20:12  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Kail Itorr писал(a):
Рассматриваю эталонный пример 18/06/2005 12:00 - должно конвертироваться в 19/5/22 11:00

Hr = 60;
NWDay = 29*Hr+72; // = 1812
NWMon = 40 * NWDay; // = 72480
NWYear = 11 * NWMon; // = 797280
OWDay = 24*60; // = 1440

DeltaOldWorld_days = 18/06/2005 - 6/1/1973 = 11851
Delta = 11851 * 1440 + (12-12)*60 + 0-24 = 17065416

NewWorldYear = (Delta div NWYear) + 1 = 17065416 div 797280 + 1 = 22
DeltaYear = Delta mod NWYear = 17065416 mod 797280 = 322536

NewWorldMon = (DeltaYear div NWMon) + 1 = 322536 div 72480 + 1 = 5
DeltaMon = DeltaYear mod NWMon = 322536 mod 72480 = 32616

NewWorldDay = (DeltaMon div NWDay) + 1 = 32616 div 1812 + 1 = 19
DeltaDay = DeltaMon mod NWDay = 32616 mod 1812 = 0
А вот и вылезла ошибка: здесь должно быть 11 часов ровно, т.е. 660.
Значит, в исходной формуле неправильно определено ВРЕМЯ начала отсчета (т.е. День1 - правильно, а вот Час1-Мин1 - нет), и нужно перевести соотв. стрелки на 11 часов вперед.

Т.е. Delta = DeltaOldWorld_days * OWDay + (CurrentHrs - 1) * Hr + CurrentMins - 24

Скомпилируй этот вариант, тогда мы чего-то будем иметь...

Кайл, что в выделенной строчке означает скобка (12-12)*60
В начало страницы
Kail Itorr
 Написано: 27.08.2012, 20:13  

Автор


Регистрация: 26.04.2012
Сообщений: 11696
Откуда: Киев, Украина
Имя: Кайл Иторр
Где-то прокол "умножения на два", в первой версии были одиннадцать часов лишние, а теперь одиннадцати часов недостает...
В начало страницы
Kail Itorr
 Написано: 27.08.2012, 20:15  

Автор


Регистрация: 26.04.2012
Сообщений: 11696
Откуда: Киев, Украина
Имя: Кайл Иторр
lvbnhbq писал(a):
Kail Itorr писал(a):
Рассматриваю эталонный пример 18/06/2005 12:00 - должно конвертироваться в 19/5/22 11:00

Hr = 60;
NWDay = 29*Hr+72; // = 1812
NWMon = 40 * NWDay; // = 72480
NWYear = 11 * NWMon; // = 797280
OWDay = 24*60; // = 1440

DeltaOldWorld_days = 18/06/2005 - 6/1/1973 = 11851
Delta = 11851 * 1440 + (12-12)*60 + 0-24 = 17065416
Кайл, что в выделенной строчке означает скобка (12-12)*60

В исходной формуле "Час1 Мин1" было рассчитано как 12:24, соответственно из текущего времени эти 12 ч 24 мин надо вычитать (ну и часы множить на 60 как положено)...
В начало страницы
DStaritsky
 Написано: 27.08.2012, 20:15  

космический ватник


Регистрация: 09.04.2012
Сообщений: 19944
Откуда: Росиия Москва
Имя: Дмитрий Старицкий
lvbnhbq писал(a):
Насколько еще шевелятся в мозгЕ остатки знаний, мне не очень понравилась вот эта строчка "DeltaOldWorld_days = div ( ( mktime(CurrentHrs, CurrentMins, 0,CurrentMon,CurrentDay,CurrentYear) - mktime(0, 0, 0,1,6,1973) ) , (60*60*24) );", а именно отбрасывание дробной части. Не может это дать накопление ошибки?

по египетскому календарю лишний от дробеых значений месяц набрался за 700 лет, что потребовало введение нового календаря - юлианского.

Так что для наших нужд пока не существенно.
В начало страницы
Ray
 Написано: 27.08.2012, 20:21  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
Стоп. Это я накосячил.
Все считает правильно! :yahoo:

Проверяйте.
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 20:25  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Ray писал(a):
Стоп. Это я накосячил.
Все считает правильно! :yahoo:

Проверяйте.

Тогда, я таки скопипастю сообщение № 104! :D

[изображение] [изображение] [изображение]
В начало страницы
Ray
 Написано: 27.08.2012, 20:28  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
Но тогда неправильно считает 22-08-2012 13:00 :wall:

Получается: 23-02-27 03:12, среда
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 20:32  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Ray писал(a):
Но тогда неправильно считает 22-08-2012 13:00 :wall:

Получается: 23-02-27 03:12, среда

Опять я сглазил?! :shock: :cry:
В начало страницы
Ray
 Написано: 27.08.2012, 20:44  

Site Admin


Регистрация: 12.01.2012
Сообщений: 17314
Откуда: Ярославль
Имя: Андрей
lvbnhbq писал(a):
Опять я сглазил?! :shock: :cry:

Это всё твои картинки глазастые! :twisted:
В начало страницы
lvbnhbq
 Написано: 27.08.2012, 21:17  

Писатель


Регистрация: 21.03.2012
Сообщений: 10823
Откуда: Донецк
Имя: Дмитрий Ефименко
Ray писал(a):
Это всё твои картинки глазастые! :twisted:

[изображение] [изображение]
В начало страницы
Dingo
 Написано: 27.08.2012, 21:43  

Товарищ Маузер


Регистрация: 05.03.2012
Сообщений: 5406
Откуда: Ярославль
Имя: Евгений
Зачётно!!! :good:
В начало страницы
  Всего сообщений: 261
Быстрый переход:  
  Модераторы:  Cruz, Matraskin, n90, Orc, PROF
Эту тему просматривают: нет зарегистрированных пользователей , гости: 8