Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Нахождение дня недели


Автор: politex 20.11.2004, 10:33
Есть ли какой нибудь алгоритм нахождение дня недели зная дату dd.mm.yyyy ? smile
Например если 20.11.2004 то ответ СУББОТА. smile

Автор: Alex 20.11.2004, 12:14
В Delphi, это функция DayOfTheWeek из модуля DateUtils.

Автор: GePo 20.11.2004, 13:42
politex
конечно же есть. Самое простое, это взять какой-нибудь понедельник, подсчитать сколько от него прошло дней до данной даты и сделать c mod 7 + 1. В дельфе вроде так и работает smile

Автор: Akina 20.11.2004, 14:46
politex
Практически в любом языке есть функция форматирования вывода. И для форматов даты-времени там есть вывод дня недели.

Автор: III.nfo 21.11.2004, 10:19
В своё время я решил проблему так (lang C#):

Код

public static string Get (int day, int month, int year)
{
    year -= 2000;
    int yd = 0;
    int y = year;
    int [] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int md = 0;
    int k = 0;
    for (int i = 1; i < month; i++)
    {
              md += m[k];
              k++;
    }
    int sum = 0;
    if (year <  0)
    {
              y = - y;
              yd = 365 * y + y / 4;
              if (month > 2 & year % 4 == 0) {yd--;}
              sum = 6 - (yd - md - day) % 7;
    }
    if (year == 0)
    {
              sum = (md + day) % 7;
              if (month < 3) {sum--;}
              if (sum == -1) {sum=6;}
              if (sum == -2) {sum=5;}
    }
    if (year >  0)
    {
              y--;
              yd = 365 * y + y / 4 + 1;
              if (month > 2 & year % 4 == 0)    {yd++;} 
              sum = (yd + md + day) % 7;
    }
    string [] d = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    return (d[sum]);
}

Автор: Peter 6.12.2004, 11:41
Есть такая формула Зеллера. Поищи в интернете.

Автор: Albinos_x 8.12.2004, 20:06
Смотри DRKB, там есть

Автор: neutrino 8.12.2004, 23:32
Вот простенькая программа, которая дает следующую дату. Можно отсчитать со дня, о котором известно какой он день недели. Считать надо по модулю 7.

Код

#include <iostream.h>
#include <math.h>

void main()
{
int day, month, year;
printf("\nEnter today's date (d/m/y):");
scanf("%d/%d/%d", &day, &month, &year);
if (month!=2) { // It is not feb?
     day=(day+1)%31; // If it is not feb, the maximum is 31 days
     if (day==0) { // Jumped over the maximum?
        day++; // Add 1 to the day. There are no zero days!
        if (!(month==4||month==6||month==9||month==11)) day+=30; // If it is
     }                                   // 31 days month, add 30 days more.
} else { // It is feb
     day=(day+1)%29; // There are 29 days maximum in feb
     if (day==0) { // Jumped over the maximum?
        day++; // Add 1 to the day.
        if (year%4==0) day+=28; // If it is a leap-year, add 28 days more.
     }
}
if (day==1) month=(month+1)%13; // New month?
if (month==0) { // Jumped over maximum months=12?
     month++; // It is jan.
     year++; // and new year! Happy new year!!! :)
  }
printf("\nTomorrow's date: %d/%d/%d", day, month, year);
}

Автор: Elvis 11.12.2004, 21:26
Хотите прикол?

2000 -- не високосный год был!!!

формула год/4 _ПОЧТИ_ верная!!! В феврале 29 дней если год нацело делится на 4 и не делится на 400!!!

400, 800, 1200, 1600, 2000, 2400... годы НЕ високосные!

P.S. кста, календарь виндовый говорит, что есть 29,02,2000. (((у мя ХР). Гляньте плз что в 98

Автор: Alex 11.12.2004, 21:51
Elvis, ты перегрелся
http://www.web-master.ru/calendar2000/p1.gif

Автор: Alex 12.12.2004, 11:40
Григорианский календарь. Вследствие того, что продолжительность юлианского года больше тропического на 11 мин 14 сек, то за 128 лет накапливалась ошибка в целые сутки. Поэтому к концу 16 в. весеннее равноденствие, которое в 325 н. э. приходилось на 21 марта, наступало уже 11 марта. Ошибка была исправлена в 1582, когда на основе буллы папы римского Григория XIII была произведена реформа юлианского К. Для его исправления счёт дней был передвинут на 10 сут вперёд, и день после четверга 4 октября предписывалось считать пятницей, но не 5, а 15 октября Так весеннее равноденствие вновь было возвращено на 21 марта. Чтобы избежать новой ошибки, было решено в каждые 400 лет выбрасывать из счёта 3 дня. Таким образом, вместо 100 високосных дней на каждые 400 лет в юлианском К. в новом К. их стало только 97. Из числа високосных были исключены те вековые годы (годы с двумя нулями на конце), число сотен которых не делится без остатка на 4. Такими годами, в частности, являлись: 1700, 1800 и 1900. Исправленный К. получил название григорианского К., или нового стиля (в отличие от юлианского, за которым укрепилось назв. «старый стиль»). Средняя длина года в нём превосходит продолжительность тропического всего на 26 сек, что приводит к ошибке в одни сутки лишь за 3280 лет. Разница между старым и новым стилями составляет: для 18 в. 11 сут, для 19 в. 12 сут и для 20 в. 13 сут.

Автор: podval 14.12.2004, 17:02
До кучи. В образовательных целях.

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Calculating day of week by date
//  (c) Johna Smith, 1996
//
//  Method description:
//    Here we use special formulas different for January & February
//  and other monthes. Use this algorithm only for dates after
//  October, 15, 1528
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

enum Month {January=1,February,March,April,May,June,July,August,
           September,October,November,December};

struct Date
{
 float day;
 Month month;
 int year;
};

int DayOfWeek(Date date)
{
 float F;

 if (date.month<March)
   F=365*date.year+date.day+31*(date.month-1)+
     (int)((date.year-1)/4)-(int)(3*(int)((date.year-1)/100+1)/4);
 else
   F=365*date.year+date.day+31*(date.month-1)-(int)(0.4*date.month+2.3)+
     (int)(date.year/4)-(int)(3*(int)(date.year/100+1)/4);

 return  F-7*(int)(F/7)-1;
}


Date Today={11,October,1996};

void main(void)
{
 printf("%f/%d/%d is ",Today.day,Today.month,Today.year);
 switch (DayOfWeek(Today))
 {
      case -1:printf("Sunday\n");break;
      case 0:printf("Monday\n");break;
      case 1:printf("Tuesday\n");break;
      case 2:printf("Wednesday\n");break;
      case 3:printf("Thursday\n");break;
      case 4:printf("Friday\n");break;
      case 5:printf("Saturday\n");break;
 }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)