퇴근5분전

 

다시 만들었다.

 

 

 

디자인은 동일하게 가져가고 내부 로직은 좀더 간결하게 바꾸었다.

 

주차에 대한것은 아래처럼 몇주차를 어렵게 구하지 않고 현재로부터 -1, + 1 형태로 변수 세개로 처리했다.

기존 달력은 문제점이... 조금씩 틀어지는 부분이 있어서 위처럼 1픽셀까지 맞추었다.

 

 

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 이 달력은 새로 만든 스케쥴러에 사용한 달력임.

 

휴일과 관련된 내용과 몇 주차 인지에 대해 계산에 사용한 방법등을 기록해본다.

 

 # 해당년도의 1월 1일의 요일에 대한 코드값을 구한다.

int {올해 1월1일 요일} =  (int)new DateTime(DateTimeInfo.Year, 1, 1).DayOfWeek;

요일은

일요일 = 0,

월요일 = 1,

...

토요일 = 6

 

 

몇주차 구하기 :

한해는 365일로 7로 나누면 52.1... 총 53주가 나옴.

 

DateTimeInfo.DayOfYear  는 올해 365일중 몇일인지가 나옴.

 

int 몇주차 = (DateTimeInfo.DayOfYear + {올해 1월1일 요일}) / 7;
if ((DateTimeInfo.DayOfYear + {올해 1월1일 요일}) % 7 > 0) thisWeekCnt++;

 

전주, 금주, 차주를  구하면서...

년도가 바뀌는 부분인 12월 31일 ~ 1월1일로 지나가는 주차 묶어주는 계산

ex)    ((2014 - 2013 )*53) - ((2014-2013)*계산주) + ( 이번주차 - 1)

 

계산주 같은 경우 전년도 계산주기때문에 12월 마지막주와 새해 1월 1일은 같은 주차가 되는데

12월 마지막주차는 53주차로 위 계산에서 0이 되므로!

12월 마지막주의 전주는 52이므로 1을 더하게 된다.. 이렇게 계산되면 계속 전주차는 계속 줄어듬...

 

if (StartDateTime.Year == DateTime.Today.Year)
{
    int weekGap = thisWeekCnt - calcWeekCnt;
    if (weekGap == 0)
    {
        weekCountButton.Text = "금주";
    }
    else if (weekGap == 1)
    {
        weekCountButton.Text = "전주";
    }
    else if (weekGap == -1)
    {
        weekCountButton.Text = "차주";
    }
    else
    {
        weekCountButton.Text = - (weekGap) + " 주";
    }
}
else
{
    weekCountButton.Width -= 3;
    weekCountButton.Text = -((((DateTime.Today.Year - StartDateTime.Year) * 53) - ((DateTime.Today.Year -  StartDateTime.Year) * calcWeekCnt)) + (thisWeekCnt - 1)) + " 주";                         
}

 

전주차 ( 년도 변환되는 곳 )

 

 

# 국경일 기념일 처리..

private SortedList<DateTime, string> GetDayHolidays(int year)
{
    //휴일 
    SortedList<DateTime, string> holidays = new SortedList<DateTime, string>();
    //( 양력 )
    holidays.Add(new DateTime(year, 1, 1), "신정"); // 신정
    holidays.Add(new DateTime(year, 3, 1), "3.1절"); // 3.1절(5대 국경일)
    holidays.Add(new DateTime(year, 5, 5), "어린이날"); // 어린이날
    holidays.Add(new DateTime(year, 6, 6), "현충일"); // 현충일
    //holidays.Add(new DateTime(year, 7, 17), "제헌절"); // 제헌절 (5대 국경일, 휴일에서 제외됨)
    holidays.Add(new DateTime(year, 8, 15), "광복절"); // 광복절 (5대 국경일)
    holidays.Add(new DateTime(year, 10, 3), "개천절"); // 개천절(5대 국경일)
    holidays.Add(new DateTime(year, 10, 9), "한글날"); // 한글날(5대 국경일)
    holidays.Add(new DateTime(year, 12, 25), "크리스마스"); // 크리스마스
    //음력
    KoreanLunisolarCalendar kc = new KoreanLunisolarCalendar();
    //설
    holidays.Add(kc.ToDateTime(year, 1, 1, 0, 0, 0, 0), "설");
    holidays.Add(kc.ToDateTime(year, 1, 1, 0, 0, 0, 0).AddDays(-1), "설(전)");
    holidays.Add(kc.ToDateTime(year, 1, 1, 0, 0, 0, 0).AddDays(+1), "설(후)");
    //석가탄신일
    holidays.Add(kc.ToDateTime(year, 4, 8, 0, 0, 0, 0), "석가탄신일");
    //추석
    holidays.Add(kc.ToDateTime(year, 8, 15, 0, 0, 0, 0), "추석");
    holidays.Add(kc.ToDateTime(year, 8, 15, 0, 0, 0, 0).AddDays(-1), "추석(전)");
    holidays.Add(kc.ToDateTime(year, 8, 15, 0, 0, 0, 0).AddDays(+1), "추석(후)");
    return holidays;
}

 

 

적용 )

var holidays = DayHolidays.Where(d => (d.Key.Year == _info.DateTimeInfo.Year && d.Key.Month == _info.DateTimeInfo.Month))

                                      .Select(d => new { DAY = d.Key.Day, DESC = d.Value });

 

if (holidays.Where(d => d.DAY == _info.DateTimeInfo.Day).Count() > 0)
{
    _btn.ForeColor = HolidayForeColor;
    string tooltip = holidays.Where(d => d.DAY == _info.DateTimeInfo.Day).Select(t => t.DESC).First();
    _btn.MouseHover += (s, e) => { toolTip1.SetToolTip(_btn, tooltip); };
}

 

- 설 같은것 툴팁으로 표시 ( 음력계산기를 이용 함 )

 

 

 

 

 

 

 

 

'# 1) 프로그래밍' 카테고리의 다른 글

가장 가까운 점 구하기  (0) 2014.02.08
한글분해_결합, 오토마타...  (0) 2014.01.30
알고리즘] 2  (0) 2013.11.15
알고리즘] 1  (0) 2013.11.14
C#] 문자열 정렬처리...  (0) 2013.11.10