본문 바로가기

C#/Calendar

C# 날짜관련 / 달력관련

C# 날짜관련 / 달력관련

 

https://pjm187.tistory.com/22

 

C# 날짜관련 달력관련

// 오늘 날짜를 가져오는 방법: (3월 8일 목요일) DateTime today = DateTime.Today; // 1일 날짜를 가져오는 방법: (3월 1일 목요일) DateTime first_day = today.AddDays(1 - today.Day); // 첫번째 주의 일요일..

pjm187.tistory.com

// 오늘 날짜를 가져오는 방법: (3월 8일 목요일)
DateTime today = DateTime.Today;

// 1일 날짜를 가져오는 방법: (3월 1일 목요일)

DateTime first_day = today.AddDays(1 - today.Day);

// 첫번째 주의 일요일을 가져오는 방법: (2월 25일 일요일)

DateTime first_sunday = first_day.AddDays(0 - (int)(first_day.DayOfWeek));

// 첫번째 주의 일수를 가져오는 방법: (3일)

int first_week_day_count = 7 - (int)(first_day.DayOfWeek);

// 말일 날짜를 가져오는 방법: (3월 31일 토요일)

DateTime last_day = today.AddMonths(1).AddDays(0 - today.Day);

// 마지막 주의 일요일을 가져오는 방법: (3월 25일 일요일)

DateTime last_sunday = last_day.AddDays(0 - (int)(last_day.DayOfWeek));

// 마지막 주의 일수를 가져오는 방법: (7일)

int last_week_day_count = last_day.DayOfYear - last_sunday.DayOfYear + 1;

// 이번 달의 주수를 가져오는 방법: (5주)

int this_month_week_count = ((last_sunday.DayOfYear - first_sunday.DayOfYear) / 7) + 1;

//이번달의 주차를 안다.
private int GetMonthWeekly(DateTime Date)
{
    int i_Days = Date.Day;
    DateTime DateTemp = new DateTime((int)Date.Year, (int)Date.Month, 1);

    int count = 1;
    for (int i = 1; i <= i_Days; i++)
    {
        if (DateTemp.DayOfWeek == DayOfWeek.Sunday)
        {

            if (i > 1) / 첫날이 일요일이면 증가하지 않는다.
                count++;
        }
        DateTemp = DateTemp.AddDays(1);
    }
    return count;
}

// 해당일자의 주수를 가져오는 방법:
private string GetJuCha(DateTime Date)

{

    System.Globalization.CultureInfo myCI = new System.Globalization.CultureInfo("en-US");

    return myCI.Calendar.GetWeekOfYear

    (Date, System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.DayOfWeek.Sunday).ToString();

}
//*****************************//
//이번달의 주 수를 알고자 할 때 또다른 방법
private int GetWeekCount(int year, int month)

{

    int days = DateTime.DaysInMonth(year, month);

    DateTime DateTemp = new DateTime(year, month, 1);

    int count = 1;

    for (int i = 1; i <= days; i++)

    {

        if (DateTemp.DayOfWeek == DayOfWeek.Sunday)

        {

            if (i > 1)///첫날이 일요일이면 증가하지 않는다.

                count++;

        }

        DateTemp = DateTemp.AddDays(1);

    }

    return count;

}


//************ 월이 바뀌면서 그 주의 주차 일자 알기
//선택한 날의 일요일부터 토요일까지 (그 주의 날자 정보를 안다.)
string sStartWeekDay = string.Empty;//선택한 주의 일요일
string sEndWeekDay = string.Empty;//선택한 주의 토요ㅣㄹ

//sNowWeek=DataTime.Now 의 주차
//GetSundaySaturDay(DataTime.Now, sNowWeek, sStartWeekDay, sEndWeekDay);
private void GetSundaySaturDay(DateTime chooseDate, int sNowWeek, ref string sStartWeekDay, ref string sEndWeekDay)
{
    //1일부터 말일까지 루프돌면서 해당주의 일요일부터 토요일까지 안다. 

    int i_Days = chooseDate.Day;
    DateTime DateTemp = new DateTime((int)chooseDate.Year, (int)chooseDate.Month, 1);

    int weekCount = 1;

    if (i_Days == 1)
    {
        if (DateTemp.DayOfWeek == DayOfWeek.Sunday)
        {
            sStartWeekDay = DateTemp.Date.ToShortDateString();
            sEndWeekDay = DateTemp.AddDays(7).Date.ToShortDateString();
            return;
        }
        else
        {
            DateTime dPreMonthWeekDate = DateTemp.AddDays(0 - (int)(DateTemp.DayOfWeek));
            sStartWeekDay = dPreMonthWeekDate.ToShortDateString();
            sEndWeekDay = dPreMonthWeekDate.AddDays(7).ToShortDateString();
            return;
        }
    }
    else
    {
        for (int i = 1; i <= i_Days; i++)
        {
            if (DateTemp.DayOfWeek == DayOfWeek.Sunday)
            {
                if (i > 1) //첫날이 일요일이면 증가하지 않는다. 
                    weekCount++;
            }
            if (sNowWeek == weekCount)
            {
                sStartWeekDay = DateTemp.Date.ToShortDateString();
                sEndWeekDay = DateTemp.AddDays(7).Date.ToShortDateString();
                break;
            }
            DateTemp = DateTemp.AddDays(1);
        }
    }


    private void InitCalendar(int count)
    {

        string strYear = strStandMonth.Substring(0, 4);
        string strMonth = strStandMonth.Substring(4, strStandMonth.Length - 4);
        FarPoint.Win.Spread.GridLine gl = new FarPoint.Win.Spread.GridLine(FarPoint.Win.Spread.GridLineType.None, Color.Red);
        fpSpread1.ActiveSheet.HorizontalGridLine = gl;
        //현재 월의 날짜수
        int nCalander_DayCount = DateTime.DaysInMonth(Convert.ToInt16(strYear), Convert.ToInt16(strMonth));
        //해당월1일의 요일
        int nFirstWeek = Microsoft.VisualBasic.DateAndTime.Weekday(Convert.ToDateTime(Convert.ToInt16(strYear) + "-" + Convert.ToInt16(strMonth) + "-" + "01"), FirstDayOfWeek.Sunday);
        //해당월 말일의 요일
        int nLastWeek = Microsoft.VisualBasic.DateAndTime.Weekday(Convert.ToDateTime(Convert.ToInt16(strYear) + "-" + Convert.ToInt16(strMonth) + "-" + nCalander_DayCount), FirstDayOfWeek.Sunday);
        //해당월의 
        int nRow = 1;

        //현재의 월
        DateTime month = Convert.ToDateTime(Convert.ToInt16(strYear) + "-" + Convert.ToInt16(strMonth) + "-" + "01");


        DateTime first_day = month.AddDays(1 - month.Day);
        DateTime last_day = month.AddMonths(1).AddDays(0 - month.Day);
        DateTime last_sunday = last_day.AddDays(0 - (int)(last_day.DayOfWeek));
        DateTime first_sunday = first_day.AddDays(0 - (int)(first_day.DayOfWeek));
        int this_month_week_count = ((last_sunday.DayOfYear - first_sunday.DayOfYear) / 7) + 1;


        //주 단위
        for (int i = 0; i <= 6 * (count + 1); i = i + count)
        {
            //말일이 토요일인경우 빈row가 추가되는 것을 막는다.
            if (nRow - 1 == nCalander_DayCount && nLastWeek.ToString() == "7")
            {
                return;
            }
            //한줄추가
            SpreadUnBoundUtil.AddRowsLast(fpSpread1, 1); //월표시나는곳
            dt.Rows.Add(dt.NewRow());
            //일 단위
            for (int j = 0; j < fpSpread1.ActiveSheet.ColumnCount; j++)
            {
                //해당 1일의 요일이 되기전의 요일을 ""로 채워준다.
                if (i == 0 && j < nFirstWeek - 1)
                {
                    UtilLibrary.Spread.SetValue(fpSpread1, i, j, "");
                    dt.Rows[i][j] = "";
                }
                else
                {
                    if (nRow <= nCalander_DayCount)
                    {
                        dt.Rows[dt.Rows.Count - 1][j] = (nRow.ToString().Length == 1 ? "0" + nRow.ToString() : nRow.ToString());
                        UtilLibrary.Spread.SetValue(fpSpread1, fpSpread1.ActiveSheet.RowCount - 1, j, nRow++.ToString());
                        //일요일 표시
                        if (j == 0)
                        {
                            fpSpread1.ActiveSheet.Cells[fpSpread1.ActiveSheet.RowCount - 1, j].ForeColor = Color.Red;
                        }
                        //토요일표시
                        if (j == 6)
                        {
                            fpSpread1.ActiveSheet.Cells[fpSpread1.ActiveSheet.RowCount - 1, j].ForeColor = Color.Blue;
                        }
                        //셀잠금
                        fpSpread1.ActiveSheet.Cells[fpSpread1.ActiveSheet.RowCount - 1, j].Locked = true;
                        //정렬
                        fpSpread1.ActiveSheet.Cells[fpSpread1.ActiveSheet.RowCount - 1, j].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Left;

                        FarPoint.Win.BevelBorder bevelbrdr = new FarPoint.Win.BevelBorder(FarPoint.Win.BevelBorderType.Raised, Color.Black, Color.Black, 1, false, false, false, true);
                        fpSpread1.ActiveSheet.Cells[fpSpread1.ActiveSheet.RowCount - 1, j].Border = bevelbrdr;


                    }
                    else
                    {
                        if (fpSpread1.ActiveSheet.RowCount >= 6 * (count + 1))
                        {
                            //갯수가초과했는데 현재 주가 6주인경우
                            if (this_month_week_count != 6)
                            {
                                fpSpread1.ActiveSheet.RemoveRows(fpSpread1.ActiveSheet.RowCount - (2 + count), count + 2);
                                //fpSpread1.ActiveSheet.RemoveRows(fpSpread1.ActiveSheet.RowCount - 1, 1);
                                // dt.Rows.RemoveAt(dt.Rows.Count - 1);
                                fnRemoveDsRow(dt, count + 2);
                            }
                            else //6주인경우 1개만 지워준다.
                            { //선증가 후처리이기때문
                                fpSpread1.ActiveSheet.RemoveRows(fpSpread1.ActiveSheet.RowCount - 1, 1);
                                dt.Rows.RemoveAt(dt.Rows.Count - 1);
                            }
                            return;
                        }
                    }

                }
            }
            SpreadUnBoundUtil.AddRowsLast(fpSpread1, count); //월표시나는곳
            addrow(dt, count + 1);
        }
    }
}


'C# > Calendar' 카테고리의 다른 글

C# 달력관련 클래스  (0) 2020.08.20