Учитывая год, это найдет день недели для 1 января, где воскресенье 0 и суббота 6

аюсь выяснить, какой день недели нулевого дня (1 января) данного года.

До сих пор я посмотрел на странице Википедии "Расчет дня недели'но мне было интересно, есть ли самый простой алгоритм, если вы просто пытаетесь найти нулевой день.

 stevenvh15 февр. 2009 г., 16:41
Начиная отсчет с нуля. Да, должен быть программистом :-). "Так, кто идет на вечеринку?" «Алиса, Боб и я. Посмотрим, это 0, 1, 2. Да, два человека».
 S.Lott26 янв. 2009 г., 03:34
Вы просите, чтобы календарь стал как-то проще, чем есть?
 Robert Gould26 янв. 2009 г., 09:32
Да, в любом случае, я не заинтересован в нулевом дне ...
 Jonathan Leffler26 янв. 2009 г., 06:16
Я думаю, что впервые слышу о том, что 1 января называют «нулевым днем»; большинство людей называют это «первый день» года.

Ответы на вопрос(12)

Решение Вопроса

ветствующий день недели (значения дня недели, хранящиеся в массиве / векторе). Это было бы самый быстрый и простой алгоритм. Но этот алгоритм не совсем понятен кому-то, читающему код. Ваш выбор зависит от того, хотите ли вы быстро, просто или «четко правильно».

 Eclipse26 янв. 2009 г., 04:17
(Ну до 2400)
 j_random_hacker26 янв. 2009 г., 05:43
Извините, надо -1, как меня укусило правило, данное Нихилом в 2000 году. Недостаточно людей знают полное определение високосного года!
 Joe Soul-bringer26 янв. 2009 г., 04:29
Да, я смутно помню, что некоторые странные дни или другие добавляются время от времени. Я полагаю, у нас может быть проблема 2400 года.
 Donnie H26 янв. 2009 г., 04:13
Спасибо, это было идеально для того, что мне было нужно.
 Nikhil Chelliah26 янв. 2009 г., 04:41
Годы, делимые на 100, являются високосными, только если они делятся на 400. Следовательно, 2000 и 2400 являются високосными годами, а 1900 и 2100 - нет.

используя Excel, и 1582-3000, используя Python.datetime.

dayOfWeek = (year*365 + trunc((year-1) / 4) - trunc((year-1) / 100) +
             trunc((year-1) / 400)) % 7

Это даст день недели как 0 = воскресенье, 6 = суббота. Этот результат можно легко скорректировать, добавив константу до или после модуля 7. Например, чтобы соответствовать соглашению Python о 0 = понедельник, добавьте 6 перед модулем.

улирования датами ... Я бы использовал их вместо реализации какого-либо (возможно, неполного) алгоритма.

 Jonathan Leffler26 янв. 2009 г., 06:18
Предполагая, что «язык» - это стандарт C, нетрудно сказать, что в нем указывается день недели произвольной даты. Это можно сделать - это не так просто сделать.
 orfdorf29 окт. 2014 г., 00:33
-1 не отвечает на вопрос.
 alex21 дек. 2011 г., 10:10
Во встроенной среде (где вы пытаетесь сэкономить место) это предположение в основном выходит за рамки ...
 BCS25 мая 2009 г., 19:30
Хорошая идея, если у языка есть это. Не работает горстка бобов, если вы загрузитесь
 stevenvh11 февр. 2013 г., 15:02
Сказать «использовать существующую реализацию» - неправильный ответ, если пользователь запрашивает алгоритм.

димые правила. Вы также можете упростить конгруэнтность Целлера, жестко закодировав месяц и день месяца.

а затем добавить дни года (мод 7), чтобы вести счет, но, как сказал Зак, использование встроенных функций будет намного проще.

 Jonathan Leffler26 янв. 2009 г., 06:14
@j_random_hacker: На самом деле, ровно (365 * 400 + 97) / 7 = 20871 неделя за 400 лет, поэтому 400-летний цикл повторяется ровно, без необходимости переходить к 2800-летнему циклу. Если бы 400 лет не были точным числом недель, вы были бы правы.
 j_random_hacker26 янв. 2009 г., 05:47
На самом деле это цикл 400 * 7 = 2800 лет. Смотрите комментарий Нихила по поводу ответа Джо.
 j_random_hacker29 янв. 2009 г., 13:37
@Jonathan: Вы правы, я исправлен.
 Joe Soul-bringer26 янв. 2009 г., 03:57
Вы получили здесь високосный год. Это 28, а не 7, из-за этого.
 zenazn26 янв. 2009 г., 06:00
Я имел в виду добавить 365 (или 366), а затем сделать мод 7. Это точно, если вы можете прогнозировать високосные годы.

и вам необходимо рассчитать день указанной даты. Затем используйте данную формулу [{(CC / 4) -2 * CC -1} + (YY * 5/4) + {(MM + 1) * 26/10} + DD] = x, x / 7 = Y где Y - остаток, где Y может быть 0,1,2,3,4,5,6. где 0 можно обозначить как воскресенье, 1 - понедельник, 2 - вторник, 3 - среда и т. д.

 Ashish Singh16 янв. 2014 г., 14:26
Следует помнить, что всегда отбрасывать остаток в данной формуле или при расчете х

чем статья в Википедии, но это все еще является общим:

http://stason.org/TULARC/society/calendars/2-5-What-day-of-the-week-was-2-August-1953.html

     #!/usr/local/bin/perl 
     use integer
     %day=                 (0=>Sunday,1=>Monday,2=>Tuesday,3=>Wednesday,4=>Thursday,5=>Friday,6=>Saturday);
     print("entered date is");
     $day=30;
     $month=11;
     $year=2680;
     $x=&day_of_week($year,$month,$day);
     if($day>31||$month>12)
{
    print("this date doesn't exist \n");
    exit;
}

    if($year%400 ==0 || ($year%100 != 0 && $year%4 == 0))
{
    if($day>29&&$month==2)
    {
        printf("this date dosen't exist \n");
        exit;
    }
}
   if($month==(4,6,9,11)&&$day>30)
{
        printf("this date dosen't exist \n");
        exit;
}


     sub day_of_week{
my ($year,$month,$day)[email protected]_;
print("yy/mm/dd: $year/$month/$day\n");
my  $a=(14-$month)/12;
my  $y=$year-$a;
my  $m=$month+12*$a-2;
my  $d=($day+$y+$y/4-$y/100+$y/400+31*$m/12)%7;
return $d;
}
if(exists($day{$x}))
{
    print("$day{$x}\n");
}
else
{
    print("invalid date entered\n");
}
 user213937611 мар. 2013 г., 10:59
эта программа работает !!!!
 user213937611 мар. 2013 г., 11:01
госзакупки могут это проверить
int dayofweek(y, m, d)      /* 0 = Sunday */
int y, m, d;                /* 1 <= m <= 12,  y > 1752 or so */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
 Jonathan Leffler21 апр. 2014 г., 09:07
@jacanterbury: 1752 был, когда британские территории (такие как то, что является теперь США) переключились с юлианского на григорианский календарь, теряя 11 дней - 3-13 сентября - в процессе). Другие области мира изменились уже в 1584 году (работая по памяти), а другие - только до 20-го века (именно поэтому Октябрьская революция в России произошла в ноябре в большинстве других стран мира), и довольно много разных даты между. Вы даже можете обнаружить, что Швеция имела 30 февраля 1712 года из-за переключения (и ошибок, допущенных во время переключения).
 Vladimir03 февр. 2018 г., 10:12
 jacanterbury17 окт. 2012 г., 00:18
+1, так как мне нравится краткость этого, даже если магические числа непослушны - как вы их вычислили и почему неопределенность для дат до 1752 года?

функция w = день недели (м, д, ци)

если m> 2, m = m-2; иначе m = m + 10; cy = cy-1; конец;

с = исправить (cy / 100); у = мод (cy, 100);

w = mod (d + fix (m * 2.59) + fix (y * 1.25) + fix (c * 5.25), 7);

Хитрость заключается в том, чтобы поставить 1 марта первым днем ​​года. Независимо от того, если дата в високосный год или нет.

Примеры:

   w = week_day(01,23,2016)  --->   w = 6 {Sat)    Today
   w = week_day(12,31,1999)  --->   w = 5 {Fri)    
   w = week_day(01,01,2000)  --->   w = 6 {Sat)
   w = week_day(02,28,1900)  --->   w = 3 {Wed)    not leap year
   w = week_day(03,01,1900)  --->   w = 4 {Thu)
   w = week_day(02,29,2000)  --->   w = 2 {Tue)      leap year
   w = week_day(03,01,2000)  --->   w = 3 {Wed)

Пожалуйста, обратитесь к Mathwork File Exchange ID # 54784

Фен Ченг Чанг

day = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year) / 400) + 1) % 7;

это найдет день недели для 1 января, где воскресенье 0 и суббота 6

public String DayOfWeek()
{
    int dayofweek;
    int c,y,m,d; 
    int cc,yy;
    String dayString;
    //Im using the guassian algorithm for finding day of the week 
    cc = year/100;
    yy = year - ((year/100)*100);

    c = (cc/4) - 2*cc-1;
    y = 5*yy/4;
    m = 26*(month+1)/10;
    d = day;

    dayofweek = (c+y+m+d)%7;

    switch(dayofweek)
    {
        case 0: dayString = "Sunday";
        break;
        case 1: dayString = "Monday";
        break;
        case 2: dayString = "Tuesday";
        break;
        case 3: dayString = "Wednesday";
        break;
        case 4: dayString = "Thursday";
        break;
        case 5: dayString = "Friday";
        break;
        case 6: dayString = "Saturday";
        break;
        default: dayString = "Sorry Could not compute month :(";   
    }

    return dayString;
}



не уверен, почему это работает, но я нашел этот алгоритм глубоко в недрах поиска Google и быстро запрыгнул на него для моего проекта. то, что вы видите выше, это метод, который я должен был написать для проекта, который я делал в своем классе java в колледже, поэтому он был написан мной, но алгоритм не мой.

этот метод гарантированно будет работать на 100%, если время, я пробовал несколько дней на протяжении истории и искал их, чтобы подтвердить, что правильный ответ был найден этим методом.

Пусть дата будет DD / MM / CCYY (европейский формат), где DD - день месяца, MM - месяц, CC - цифры века, а YY - год в столетии. Итак, день рождения Вильмы был 23/06/1994. Начиная с вековых CC-цифр, рассчитайте CC / 4 - 2 * CC-1 и запомните результат. Со всеми делениями в этом упражнении откажитесь от любого остатка и просто сохраните всю часть. Итак, в нашем примере это 19/4 = 4 минус 2 * 19 = 38 минус 1, что дает минус 35.

Теперь, используя год YY, рассчитайте 5 * ГГ / 4. В этом примере это 5 * 94 = 470/4 = 117, отбрасывая остаток. Добавление этого к нашему существующему результату дает 117-35 = 82.

Используя месяц MM, рассчитайте 26 * (MM + 1) / 10. В нашем примере это 26 * 7 = 182/10 = 18, снова отбрасывая остаток. Добавьте это к нашему текущему итогу, получив 82 + 18 = 100.

Наконец, просто добавьте день DD. Здесь 100 + 23 = 123.

Теперь разделите результат на 7, оставив остаток; здесь 123 (мод 7) = 4. Считая воскресенье как ноль, понедельник = 1 и т. д., мы получаем 4 = четверг. Легко, когда знаешь как :-)

Алгоритм приписывается Гауссу. Да, я знаю, что у евреев, мусульман и т. Д. Разные календари, и я знаю о различных реформах каландров, так что это применимо только к современным стандартизированным датам, основанным на христианах, не используйте их для проверки дня распятия Христа ( -ффикция?) или даже рождение Чосера.

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

 ntoonio11 мая 2016 г., 11:45
Что это за часть?yy = year - ((year/100)*100);
 matthias krull06 окт. 2012 г., 11:05
Объяснение улучшит ваш ответ.
 Cameron Belt14 нояб. 2012 г., 03:04
я даже не знаю, как это работает, я просто погуглил метод Гаусса и вот что я нашел. в основном это просто разбивает дату на разные числа и использует эти разные числа, чтобы вычислить день недели
 maharvey6709 февр. 2017 г., 20:22
если год является целым числом, то yy = год - ((год / 100) * 100) совпадает с yy = год% 100

Ваш ответ на вопрос