Всего сообщений: 261 |
|
||||
Автор | Сообщение | |||
lvbnhbq | Сообщение #101 | |||
Писатель Регистрация: 21.03.2012 Сообщений: 10823 Откуда: Донецк Имя: Дмитрий Ефименко |
Ray писал(a): [изображение] [изображение] [изображение] | |||
В начало страницы | ||||
Ray | Сообщение #102 | |||
Site Admin Регистрация: 12.01.2012 Сообщений: 17314 Откуда: Ярославль Имя: Андрей |
Дим, рано радуешься :D Грят, неправильно считает :wall: | |||
В начало страницы | ||||
lvbnhbq | Сообщение #103 | |||
Писатель Регистрация: 21.03.2012 Сообщений: 10823 Откуда: Донецк Имя: Дмитрий Ефименко |
Ray писал(a): Дим, рано радуешься :D Грят, неправильно считает :wall: Н-да, поторопился! :pardon: Недопер подставить изветные даты. Посчитал ту, которая нужна мне, получилось похоже. Вот и обрадовался. То, что заметил: 1973 год не воспринимает в принципе, хотя 01/01/1974 выдает шестой день восьмой месяц первого года. | |||
В начало страницы | ||||
Ray | Сообщение #104 | |||
Site Admin Регистрация: 12.01.2012 Сообщений: 17314 Откуда: Ярославль Имя: Андрей |
lvbnhbq писал(a): То, что заметил: 1973 год не воспринимает в принципе, хотя 01/01/1974 выдает восьмой месяц первого года. Да, год меньше 1973 не принимается, и еще проверки правильности введенной даты нет. Это чтобы не заморачиваться с отловом нулевой даты. Оно так нужно - этот нулевой год? | |||
В начало страницы | ||||
Ray | Сообщение #105 | |||
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 | Сообщение #106 | |||
технонанонекрофил - милитарист Регистрация: 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 | Сообщение #107 | |||
Site Admin Регистрация: 12.01.2012 Сообщений: 17314 Откуда: Ярославль Имя: Андрей |
vovaz02h писал(a): mktime оперирует секундами? Да. Количество секунд с 01-01-1970 00:00:00 Цитата: Вообще куда смотреть? Реализация этого всего на PHP? Да. | |||
В начало страницы | ||||
vovaz02h | Сообщение #108 | |||
технонанонекрофил - милитарист Регистрация: 21.03.2012 Сообщений: 4707 Откуда: З нашого боку порєбріка. Имя: Владимир |
И, кстати, тут же еще один подводный камень... Получая разницу в сутках между двумя датами старого календаря простой разницей количества секунд (при пересечении даты "29 февраля"), учитывается ли при этом високосность? IMHO нет. | |||
В начало страницы | ||||
lvbnhbq | Сообщение #109 | |||
Писатель Регистрация: 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 | Сообщение #110 | |||
космический ватник Регистрация: 09.04.2012 Сообщений: 19944 Откуда: Росиия Москва Имя: Дмитрий Старицкий |
Ray писал(a): класс. автоматика руллиз!!! :good: можно уже кнопку новую вводить для удобства за Библиотекой на верху. | |||
В начало страницы | ||||
vovaz02h | Сообщение #111 | |||
технонанонекрофил - милитарист Регистрация: 21.03.2012 Сообщений: 4707 Откуда: З нашого боку порєбріка. Имя: Владимир |
lvbnhbq писал(a): А разве не все стандартные функции даты/времени понимают этот момент? :xz: Максимум моих программистских потуг по работе со временем приходится на скрипты по разборке больших логов на кучки маленьких. Там это не критично было. | |||
В начало страницы | ||||
lvbnhbq | Сообщение #112 | |||
Писатель Регистрация: 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 | Сообщение #113 | |||
Автор Регистрация: 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 | Сообщение #114 | |||
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 | Сообщение #115 | |||
Писатель Регистрация: 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 | Сообщение #116 | |||
Автор Регистрация: 26.04.2012 Сообщений: 11696 Откуда: Киев, Украина Имя: Кайл Иторр |
Где-то прокол "умножения на два", в первой версии были одиннадцать часов лишние, а теперь одиннадцати часов недостает... | |||
В начало страницы | ||||
Kail Itorr | Сообщение #117 | |||
Автор Регистрация: 26.04.2012 Сообщений: 11696 Откуда: Киев, Украина Имя: Кайл Иторр |
lvbnhbq писал(a): Kail Itorr писал(a): Рассматриваю эталонный пример 18/06/2005 12:00 - должно конвертироваться в 19/5/22 11:00 Кайл, что в выделенной строчке означает скобка (12-12)*60Hr = 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 В исходной формуле "Час1 Мин1" было рассчитано как 12:24, соответственно из текущего времени эти 12 ч 24 мин надо вычитать (ну и часы множить на 60 как положено)... | |||
В начало страницы | ||||
DStaritsky | Сообщение #118 | |||
космический ватник Регистрация: 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 | Сообщение #119 | |||
Site Admin Регистрация: 12.01.2012 Сообщений: 17314 Откуда: Ярославль Имя: Андрей |
Стоп. Это я накосячил. Все считает правильно! :yahoo: Проверяйте. | |||
В начало страницы | ||||
lvbnhbq | Сообщение #120 | |||
Писатель Регистрация: 21.03.2012 Сообщений: 10823 Откуда: Донецк Имя: Дмитрий Ефименко |
Ray писал(a): Стоп. Это я накосячил. Все считает правильно! :yahoo: Проверяйте. Тогда, я таки скопипастю сообщение № 104! :D [изображение] [изображение] [изображение] | |||
В начало страницы | ||||
Ray | Сообщение #121 | |||
Site Admin Регистрация: 12.01.2012 Сообщений: 17314 Откуда: Ярославль Имя: Андрей |
Но тогда неправильно считает 22-08-2012 13:00 :wall: Получается: 23-02-27 03:12, среда | |||
В начало страницы | ||||
lvbnhbq | Сообщение #122 | |||
Писатель Регистрация: 21.03.2012 Сообщений: 10823 Откуда: Донецк Имя: Дмитрий Ефименко |
Ray писал(a): Но тогда неправильно считает 22-08-2012 13:00 :wall: Получается: 23-02-27 03:12, среда Опять я сглазил?! :shock: :cry: | |||
В начало страницы | ||||
Ray | Сообщение #123 | |||
Site Admin Регистрация: 12.01.2012 Сообщений: 17314 Откуда: Ярославль Имя: Андрей |
lvbnhbq писал(a): Опять я сглазил?! :shock: :cry: Это всё твои картинки глазастые! :twisted: | |||
В начало страницы | ||||
lvbnhbq | Сообщение #124 | |||
Писатель Регистрация: 21.03.2012 Сообщений: 10823 Откуда: Донецк Имя: Дмитрий Ефименко |
Ray писал(a): Это всё твои картинки глазастые! :twisted: [изображение] [изображение] | |||
В начало страницы | ||||
Dingo | Сообщение #125 | |||
Товарищ Маузер Регистрация: 05.03.2012 Сообщений: 5406 Откуда: Ярославль Имя: Евгений |
Зачётно!!! :good: | |||
В начало страницы | ||||
Всего сообщений: 261 |
Модераторы: Cruz, Matraskin, n90, Orc, PROF |
Эту тему просматривают: нет зарегистрированных пользователей , гости: 9 |