про дату
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.174] |
|
|
правила раздела Алгоритмы

про дату
|
Сообщ.
#1
,
|
|
|
|
Помогите, есть ли у кого пример кода или алгоритм преобразования даты в формате(char,string) дд/мм/гггг в числовой тип, ну как в Excel-e, набрал дату, а тебе число с учетом високосных и дней в каждом месяце, начиная с 1900г.
Можно конечно Format юзать, но мне надо С (короче под DOSom), а там такой функции вроде нет. |
|
Сообщ.
#2
,
|
|
|
|
Создай массив, содержащий количество дней во всех предыдущих месяцах, т.е.
[1]Январь = 0 [2]Февраль = 31 [3]Март = 31+28 Затем... if (Год mod 4 = 0 && (Год mod 100 <> 0 || Год mod 400 = 0) && Месяц < 3) NoVis = 1 else NoVis = 0 // Если сейчас год високосный, но ещё не март, то NoVis=1... День = (Год-1900)*365 + МассивСДнями[НомерМесяца] + Число + Год div 4 - Год div 100 + Год div 400 - (1900 div 4 - 1900 div 100 + 1900 div 400) - NoVis Секунда = Час*3600 + Минута*60 + Секунда День 1 января 1900 года = 1 (если нужен 0, вычти 1) Если я нигде не ошибся, то должно быть так.... лучше проверь (подставь 29 февраля 2000 года и 1 марта 2000 года....) Високосный год - год, номер которого делится на 4, но не делится на 100. НО! Если номер года делится на 400, год считается високосным... |
|
Сообщ.
#3
,
|
|
|
|
если я правильно понял
Цитата преобразования даты в формате(char,string) дд/мм/гггг в числовой тип , тебе нужно нечто вроде этого ![]() ![]() <br>void CdmsDate::SetDateStr(const char* in)<br>{<br> const char* tmp=in;<br> char ogranich=2;<br> day=0;<br> while(isdigit(*tmp)&&ogranich)<br> {<br> day*=10;<br> day+=(*tmp)-48;<br> tmp++;<br> ogranich--;<br> }<br> //теперь tmp указывает на точку<br> tmp++;<br> ogranich=2;<br> month=0;<br> while(isdigit(*tmp)&&ogranich)<br> {<br> month*=10;<br> month+=*tmp-48;<br> tmp++;<br> ogranich--;<br> }<br> //tmp указsвает на вторую точку (разделитель)<br> tmp++;<br> ogranich=4;<br> year=0;<br> while(isdigit(*tmp)&&ogranich)<br> {<br> year*=10;<br> year+=*tmp-48;<br> tmp++;<br> ogranich--;<br> }<br> <br> if(!CheckParity()) throw Error();<br>}<br><br>bool CdmsDate::CheckParity()<br>{<br> if(year<=0) return false;<br> if(month<1||month>12) return false;<br> char nDay=monthes[month-1];<br> if(month==2&&CheckYear(year)) nDay++;<br> if(day<1||day>nDay)return false;<br> return true;<br><br>}<br><br> хех, хотя в С нет исключений... ну ладно посленюю строчку SetDateStr() там где throw Error() поменяешь. получишь три числа Day,month, year а дальше читай сообщение 7in'п еще раз:)) |
|
Сообщ.
#4
,
|
|
|
|
Спасибо всем кто ответил, и кто просто читал!!!
|