PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Високосный год


Високосный год

Сообщений 1 страница 3 из 3

1

Придумал такой способ определить колич дней в заданном году nYear
к дате nYear/1/1 (первый день года) прибавляю 365 дней
если номер дня результирующей даты =366 то это високосный год.

Но этот способ перестает работать после 2036 года
см.пример

Код:
For nYear=1999 To 2048
	QtyDays=365
	Hi$="  "
	If DayOfYear(AddDate(Date(nYear,1,1,0,0,0),#PB_Date_Day,365))=366
    QtyDays=366
    Hi$=" В"
	EndIf
	Debug Str(nYear)+" : "+Str(QtyDays)+Hi$
Nexе


Почему? Где я накосячил?

0

2

The Date library allows for the manipulation of Date and Time from 1970 up to 2038 using the Unix method (i.e. the number of seconds elapsed since the 1st of January 1970).

Note: supported date/time values are 1970-01-01, 00:00:00 for the minimum and 2038-01-19, 03:14:07 for the maximum.

http://www.purebasic.com/documentation/date/index.html
Отсчет начинается с 1970 с точностью до секунды. В 2038 пройдет такое количество секунд, что результат не помещается в 4-ех байтную переменную. Отсюда и ограничение.
Высокосный год бывает каждые 4 года и вычисления можно упростить.

Код:
For nYear=1999 To 2048
  Hi$=""
  If nYear % 4 = 0
    Hi$=" В"
  EndIf
  Debug Str(nYear)+" "+Hi$
Next

0

3

Считал что лучше использовать встроенную функцию чем сочинять свою .

Если сочинять свою то исходя из
> год является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400.
предлагаю такой вариант.

Procedure IsLeapYear(nYear)
Protected Ok=#False
If nYear%400=0 Or ( nYear%4=0 And Not (nYear%100=0) )
    Ok=#True
EndIf
ProcedureReturn Ok
EndProcedure

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Високосный год