Как узнать дату из дня недели, недели и месяца

Kilya

Местный
Регистрация
29 Апр 2005
Сообщения
121
Реакции
173
Credits
50
Как узнать дату зная только день недели, номер недени и месяц

Помогите плиз с функцией - нужно узнать полную дату, зная только день недели, номер недени и месяц. Например : 4-ая неделя, пятница, август.

ХЕЛП

UPD: Реализация нужна в IE Delphi
 
Последнее редактирование модератором:

Kilya

Местный
Регистрация
29 Апр 2005
Сообщения
121
Реакции
173
Credits
50
забыл уточнить, что в условии: зная только день недели, номер недени и месяц + текущий ГОД
На выходе полная дата в любом формате (например число.месяц.год)
 

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Номер недели с начало года, что как бы принято или с месяца
 

Kilya

Местный
Регистрация
29 Апр 2005
Сообщения
121
Реакции
173
Credits
50
Номер недели с начало года, что как бы принято или с месяца
Чтоб мы друг друга понимали уточню:
Пример -
Нужно узнать дату дня сисадмина, который отмечается в последнюю пятницу июля.
Условие: 4неделя + пятница + июль + год(2016) = "Полная дата"
 

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Нет проверок, сделал неделя с начало год, а не с начало месяца

package main.java.com;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class CalendarToDate {

private static Date getDate(int year, int week, int day) {
Calendar calendar = new GregorianCalendar();
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.add(Calendar.DAY_OF_YEAR, day-1);
return calendar.getTime();
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.println("Введите год");
int year = scanner.nextInt();

System.out.println("Введите неделю");
int week = scanner.nextInt();

System.out.println("Введите день");
int day = scanner.nextInt();

Date date = getDate(year, week, day);
System.out.println(date);
}

}
 

Kilya

Местный
Регистрация
29 Апр 2005
Сообщения
121
Реакции
173
Credits
50
Спс, но эта реализация видимо на яве. В условии забыл упомянуть, что процедура нужна в Delphi.
И вся соль в том, что нужно выудить ДЕНЬ из 4недели + пятницы + июль + год(2016)
 
Последнее редактирование модератором:

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Ну короче

Находишь номер неделю по году и месяцу и датой на 1 число
Это будет первая неделя данного месяца

Далее смещаешься на количество недель, которое тебе надо -1

Далее этой неделе с понедельника смещаешься на тот день, который тебе нужен

И от готовая дата
 

Kilya

Местный
Регистрация
29 Апр 2005
Сообщения
121
Реакции
173
Credits
50
Ну короче

Находишь номер неделю по году и месяцу и датой на 1 число
Это будет первая неделя данного месяца

Далее смещаешься на количество недель, которое тебе надо -1

Далее этой неделе с понедельника смещаешься на тот день, который тебе нужен

И от готовая дата
Вчера не было возможности отписаться.
Спсибо за обьяснение - все получилось. Респект.
 

Kilya

Местный
Регистрация
29 Апр 2005
Сообщения
121
Реакции
173
Credits
50
Нужна еще консультация:
Написал функцию для расчета. Но если нужно найти в начале месяца - тут не лады. Например: нужно найти число 7 февраля по формуле
1:4:1
1(первая неделя):4(Четверг);1(январь) (в сумме Первый четверг Января)


Вместо Даты 7 февраля я получаю 31 декабря 2015 года.
Помогите. Уже голова дымит, не могу реализовать так, чтобы проблем не было как с началом так и с концом недели.


Код:
function getdatefrom(strs: string): string;
var
  m_year, m_weekday, m_num_weekday, m_month: string;
  date_tmp, BDate: TDateTime;
  masiv: StringArray;

const
  PUNCT = [':', ';'];
begin

  if TryStrToDate(strs, BDate) then
    result := strs
  else
  Begin

    try
      SetLength(masiv, 4);
      masiv := split(strs, PUNCT);
      m_num_weekday := masiv[0];
      m_weekday := masiv[1];
      m_month := masiv[2];

    finally
      if m_num_weekday = '' then
        m_num_weekday := inttostr(WeekOfTheMonth(now));
      if m_weekday = '' then
        m_weekday := inttostr(dayOfTheMonth(now));
      if m_month = '' then
        m_month := inttostr(Monthoftheyear(now));
    end;
    // sShowMessage (m_num_weekday+' -'+m_weekday+' -'+m_month);

    if length(masiv) = 4 then
      m_year := masiv[3]
    else
      m_year := inttostr(YearOf(now));
      date_tmp := StrToDate(FormatDateTime('dd.mm.yyyy',StrToDate('01.' + m_month + '.' + m_year)));

date_tmp:=IncDay(GetMonday(IncWeek(date_tmp,StrToInt(m_num_weekday)-1)),StrToInt(m_weekday)-1);


    result := (DateToStr(date_tmp));
  End;
end;

function GetMonday(RefDay: TDate): TDate;
var
  DoW: Integer;
  DateOffset: Integer;
begin
  DoW := DayOfWeek(RefDay);
  // Montag der Woche
  if DoW = 1 then
    DateOffset := -6
  else
    DateOffset := DoW - 2;
  result := RefDay - DateOffset;
end;
 
Последнее редактирование модератором:

LeshaRB

Свой
Регистрация
11 Июн 2007
Сообщения
320
Реакции
467
Credits
39
Нужна еще консультация:
Написал функцию для расчета. Но если нужно найти в начале месяца - тут не лады. Например: нужно найти число 7 февраля по формуле
1:4:1
1(первая неделя):4(Четверг);1(январь) (в сумме Первый четверг Января)


Вместо Даты 7 февраля я получаю 31 декабря 2015 года.
Помогите. Уже голова дымит, не могу реализовать так, чтобы проблем не было как с началом так и с концом недели.


Код:
function getdatefrom(strs: string): string;
var
  m_year, m_weekday, m_num_weekday, m_month: string;
  date_tmp, BDate: TDateTime;
  masiv: StringArray;

const
  PUNCT = [':', ';'];
begin

  if TryStrToDate(strs, BDate) then
    result := strs
  else
  Begin

    try
      SetLength(masiv, 4);
      masiv := split(strs, PUNCT);
      m_num_weekday := masiv[0];
      m_weekday := masiv[1];
      m_month := masiv[2];

    finally
      if m_num_weekday = '' then
        m_num_weekday := inttostr(WeekOfTheMonth(now));
      if m_weekday = '' then
        m_weekday := inttostr(dayOfTheMonth(now));
      if m_month = '' then
        m_month := inttostr(Monthoftheyear(now));
    end;
    // sShowMessage (m_num_weekday+' -'+m_weekday+' -'+m_month);

    if length(masiv) = 4 then
      m_year := masiv[3]
    else
      m_year := inttostr(YearOf(now));
      date_tmp := StrToDate(FormatDateTime('dd.mm.yyyy',StrToDate('01.' + m_month + '.' + m_year)));

date_tmp:=IncDay(GetMonday(IncWeek(date_tmp,StrToInt(m_num_weekday)-1)),StrToInt(m_weekday)-1);


    result := (DateToStr(date_tmp));
  End;
end;

function GetMonday(RefDay: TDate): TDate;
var
  DoW: Integer;
  DateOffset: Integer;
begin
  DoW := DayOfWeek(RefDay);
  // Montag der Woche
  if DoW = 1 then
    DateOffset := -6
  else
    DateOffset := DoW - 2;
  result := RefDay - DateOffset;
end;

Я честно пытался понять, что ты хочешь
 

DrunyaRuma

Турист
Регистрация
30 Мар 2015
Сообщения
5
Реакции
0
Credits
8
Если еще не получилось попробую помочь

Добавлено через 5 минут
Я так понимаю входной параметр типа:
12 неделя + четверг + 2016 год
на выходе типа что-то 17.03.16 ? Правильно я вас понял

Добавлено через 8 минут
Вечером постараюсь написать функцию
 
Последнее редактирование модератором:

hdrd

Турист
Регистрация
11 Авг 2015
Сообщения
4
Реакции
0
Credits
6
если у кого возникнут похожие вопросы, рекомендую ознакомиться с набором функций работы с датами из стандартных модулей (sysutils, dateutils и прочие)

Для просмотра ссылки Войди или Зарегистрируйся
 

dimodimo

Местный
Регистрация
23 Сен 2007
Сообщения
18
Реакции
5
Credits
34
В зависимости от версии Delphi посмотрите DateUtils.EncodeDateWeek Function:



Returns a TDateTime that represents a specified day of a specified week in a specified year.


function EncodeDateWeek(const AYear: Word; const AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;


Для просмотра ссылки Войди или Зарегистрируйся
 

StrikerLoner

Турист
Регистрация
24 Июл 2009
Сообщения
10
Реакции
0
Credits
20
С DateUtils.EncodeDateWeek нужно помнить что сначала нужно преобразовать все месяца в недели, можно сразу воспользоваться функцией

function EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth,
ADayOfWeek: Word): TDateTime;

входные параметры:
Год
Месяц
Неделя месяца
День недели