LINUX.ORG.RU

А есть такая формула?

v9lij ★★★★★
()

Это же упражнение, которое в любом учебнике по тому или иному ЯП рассматривается. Запихиваем в массив длины месяцев, затем в цикле от 0 до текущего месяца суммируем содержимое массива и прибавляем текущую дату. Получаем номер дня от начала года.

Массив формируется статически, кроме февраля. А узнать, сколько в этом феврале дней, довольно просто: если последние 2 цифры года делятся на 4 и не являются 00, то в феврале 29 дней; если год кончается на 00, смотрим на предпоследние 2 цифры... Один раз в 3000 лет високосный год таковым не является, но это еще нескоро.

Если надо копать в прошлое, то придется гуглить, когда в какой стране принимали григорианский календарь.

Eddy_Em ☆☆☆☆☆
()

в стандартных библиотеках это есть искоробки

Harald ★★★★★
()
Ответ на: комментарий от namezys

Астрономический год примерно постоянен. Гражданский - варьируется на сутки раз в 4..8 лет и на несколько секунд раз в год, но я не думаю что будет сложно найти алгоритм, по которому «подкручивают» часы в новогоднюю ночь.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Сложно. Это делается каждый раз отдельным решением и нет пока не какой системы. Поэтому просто хранят таблицу таких подкручиваний. ЕМНА

namezys ★★★★
()
Ответ на: комментарий от namezys

В принципе, могли бы и не «подкручивать»… Все равно это делается лишь ради того «дня в 3000 лет». Мы столько не проживем…

Eddy_Em ☆☆☆☆☆
()

Нашел на перле такое решение (в общем-то, устраивает) :

sub getNumberOfDays {
	my($year, $month) = @_;
	# assign parameters to variables
	# @_ contains the list of parameters passed to the subroutine
	# they are assigned to $year and $month, respectively
	my $date =	(31,28,31,30,31,30,31,31,30,31,30,31)[$month-1];
	# use $month-1 as index into array containing the last
	# day of the month for each month
	if ( $month == 2 && (($year % 4 == 0) && ($year % 100 != 0) && ($year % 400 == 0) ) ) {
		# if month is February and if year is divisible by 4,
		# but not by 100, but by 400 - it's a leap year
		$date++;
		# increment the last day of the month
	}
	return $date;
	# return the value
}

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

вроде вместе с информацией о поясах хранится и таблица докрутов

namezys ★★★★
()

Даже в школьной математической (такая зеленая обложка) энциклопедии была формула.

anonymous
()
Ответ на: комментарий от kovrik

Если есть остаток от деления года на 4 и месяц февраль, вычесть 2, иначе - 1. Всё правильно.

Сам попробуй: perl -e '$y = 2004; $m = 2; $days_in_mon = 31 - ( ($m - 1) % 7 % 2 ) - ( ( ($m == 2) << !!($y % 4) ) ); print $days_in_mon'

helios ★★★★★
()
Ответ на: комментарий от namezys

интересней узнать количество секунд в году

Без табличных данных невозможно. Никакой формулой не предусмотреть решения правительства :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Eddy_Em

вот тебе задачка поинтересней: вычислить день недели зная число, месяц и год... и да оно реально вычислимо.

mm3 ★★★
()
Ответ на: комментарий от mm3

Где-то я ее решение на сях уже видел...

Если не вдаваться в подробности перехода той или иной страны на юлианский, а потом - григорианский календарь, то все достаточно просто: табулируем, каким днем недели было 1 января каждого года, а затем, вычисляя номер дня в году, получаем день недели.

Можно и сразу вычислять - считая количество дней, прошедших от известного, до заданного.

А можно еще проще: вычислить юлианскую дату (благо, библиотек, позволяющих это сделать, - пруд пруди) заданного числа, а затем, на основе разности между ней и юлианской даты с известным днем недели, вычислить искомый день недели.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от mm3

А он все еще по «православному» юлианскому живет ☺

Eddy_Em ☆☆☆☆☆
()
python2 -c "import calendar; print calendar.monthrange(2012, 2)[1]"
baverman ★★★
()
Ответ на: комментарий от namezys

интересней узнать количество секунд в году

в Лунном :) В каждом из N обозначенных видов :)

MKuznetsov ★★★★★
()

DateTime.DaysInMonth(now.Year, now.Month))

:P

Sholy
()

Это сильно зависит от страны, о которой идет речь.

Потому что переход с астрономического юлианского календаря на иезуитский григорианский в разных странах происходила в разное время.

В линуксах принято использовать английскую версию.

Введите, например, команду:

$ cal 9 1752

anarquista ★★★★★
()
Ответ на: комментарий от Eddy_Em

только если никаких leap second не вставлять, то да. А так всё идет в тар-тарары.

anarquista ★★★★★
()
days y m | m == 1 = if isLeapYear y then 29 else 28
         | m < 7  = 31 - m `mod` 2
         | otherwise = 30 + m `mod` 2
  where isLeapYear y = y `mod` 400 == 0 || y `mod` 4 == 0 && y `mod` 100 /= 0

-- > map (flip map [0 .. 11] . days) [2010 .. 2020]
-- [[31,28,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,29,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,29,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31],[31,29,31,30,31,30,31,31,30,31,30,31]]
quasimoto ★★★★
()
Ответ на: Y3K от fijiol

Все равно же практически никто не пишет софт с расчетом на сто лет) Все понимают это, но когда дело доходит до практики, то все пишут как проще - лишь бы работало сейчас

kovrik ★★★★★
() автор топика
Ответ на: Y3K от fijiol

а софт проживет

гыгыгы

Eddy_Em ☆☆☆☆☆
()

вы чего бредите?

Во всех месяцах каждый год число дней одинаковое. Кроме февраля. Только его и нужно вычислить. Для этого нужно только посмотреть правила определения года.

anonymous
()

А в чем проблема?

J ★★★★
()
Ответ на: комментарий от J

Делить на четыре?

Получать остаток от деления. Если 0, то високосный.

TGZ ★★★★
()
Ответ на: комментарий от namezys

Иногда год короче, чем кол-дней*24*3600 на 1 сек

ЧИВО?!

malbolge ★★
()
Ответ на: комментарий от KRoN73

Никакой формулой не предусмотреть решения правительства :)

...хотя сама по себе задача весьма интересная. :-)

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