일주일의 시작 시간을 어떻게 알 수 있습니까?


469

C #의 현재 시간 만 알고있는주의 시작 (일요일 및 월요일)을 어떻게 찾을 수 있습니까?

다음과 같은 것 :

DateTime.Now.StartWeek(Monday);

답변:


746

확장 방법을 사용하십시오. 그들은 모든 것에 대한 답입니다. ;)

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
}

다음과 같이 사용할 수 있습니다.

DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);

15
이를 다음과 같이 단순화 할 수 있습니다. int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
— Troy

13
트로이, 주어진 날짜가 일요일이고 주 시작이 월요일이면 코드가 작동한다고 생각하지 않습니다. (일요일-6) 대신 (일요일 + 1)을 반환합니다.
— Aaron Hoffman

1
경우에 작동하지 않습니다 dtUTC이며, 이미 주 등의 시작 2012-09-02 16:00:00Z입니다 Mon, 03 Sep 2012 00:00:00현지 시간으로. 따라서 dt현지 시간 으로 변환 하거나 조금 더 똑똑한 작업을 수행해야합니다. 입력이 UTC 인 경우 결과를 UTC로 리턴해야합니다.
— row1

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")은 현지 시간에 해당하는 시간을 반환 하며이 메서드는 현지 시간과 동일한 시간을 올바르게 반환합니다. DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()UTC 시간을 명시 적으로 전달하는 데 사용 하는 경우이 메서드는 16 시간 전에 6 일을 UTC 시간으로 올바르게 반환합니다. 예상대로 정확하게 작동합니다.
— 롤링

1
이것은 때때로 저를 위해 언젠가는 꺼져있을 것입니다. 에서 시간 구성 요소를 제거하면 나에게 효과적이었습니다 dt. 내가 사용int diff = dt.Date.DayOfWeek - startOfWeek;
— 빈센트 Saelzler

80

내가 생각해 낼 수있는 가장 빠른 방법은 다음과 같습니다.

var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);

다른 요일을 시작 날짜로 설정하려면 DayOfWeek 값을 끝에 추가하면됩니다.

var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);

var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday); 

2
가장 간단한 답변이 가장 좋습니다.이 답변은 제대로 작동했지만 문화에 따라
— 다릅니다.

7
라트비아에서 주 월요일에 시작합니다. 실제로 .. 일요일에 주 시작하는 방법을 항상 궁금합니다 .. 나에게 어색해 보인다 ..;)
— 0xDEAD BEEF

이 솔루션은 좋습니다. 또한 시작하려는 DayOfWeek를 추가하여 언제든지 요일을 시작할 수 있습니다. var sunday = DateTime.Today.AddDays (-(int) DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays (-(int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
— Loligans 2016 년

7
이 추가 된 코드는 Threezol에서 설명한 상황에서는 작동하지 않습니다. 주의 시작을 월요일로하려면 일요일에 계산하면 이전 월요일이 아닌 다음 월요일을 제공합니다.
— Giovanni B

4
예 .. 일요일에는 다음 Modnay를 제공합니다. 이전이 아닌 : P
— Ajay Aradhya

64

좀 더 장황하고 문화에 대한 인식 :

System.Globalization.CultureInfo ci = 
    System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
DayOfWeek today = DateTime.Now.DayOfWeek;
DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;

4
이 오류가 발생했습니다 : today = SUNDAY; fdow = 월요일; (오늘-fdow) == -1; DateTime.Now.AddDays (-(-1)). Date == DateTime.Now.AddDays (+1) .Date; 01-02-2010! = 25-01-2010 !!
— balexandre

3
일요일에 이것을 시도하면 기본적으로 en-GB에 대해 AddDays (0-1)를 수행하는 것입니다. 따라서 @Sarcastic의 if 문이 필요합니다
— Chris S

3
당신은 또한 CultureInfo.CurrentCulture그와 같은 실에서 그것을 뽑아내는 대신에 현재 문화권을 얻을 수 있습니다 . 액세스하는 이상한 방법 인 것 같습니다.
— 행크

7
또 다른 문제 : Now속성을 두 번 호출하는 것은 위험합니다 . 현재 시간이 두 통화 사이에 24:00 (또는 자정 12:00)을 지나면 날짜가 변경됩니다.
— Jeppe Stig Nielsen

1
이 대답의 실제 내용은 다음과 같습니다. "현재 .NET 주 (일요일에 시작하여 토요일에 끝나는 DayOfWeek 열거의 번호 매기기) 내에서 첫 번째 요일 인 .NET 주 중 요일을 찾습니다. 현재 문화에서 ". 이것은 아마도 당신이 원하는 것이 아닙니다.
— Mathieu Renda

36

유창한 DateTime 사용 :

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);

29
나는 이것에 대한 의존성을 싫어합니다. "의존성을 알고 그들을 죽이십시오"가 떠오른 것 같습니다. :)
— Esteban Araya

7
"Fluent"가 작동하는 방법을 아는 사람이 있습니까? 코드를 살펴보십시오. do ... while 루프를 사용하고 있습니다. 이름을 부르고 싶지는 않지만 그렇게하기로 결정하면 기분이 좋지 않습니다. public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
— nsimeonov

10
@nsimeonov 그것은 오픈 소스입니다. 돌을 던지는 것보다 더 나은 구현을 자유롭게 제공하십시오.
— Simon

12
그래, 마치 내가 세상의 모든 오픈 소스 소프트웨어에서 모든 버그를 고치기 위해 온 세상을
— 가졌던 것처럼

4
"do ... while"루프를 사용하는 것에 대한 불만에서 큰 웃음을 얻었 기 때문에 언급해야했습니다! 재밌어요! 나는 다른 프로그래머가 전에 루프에 대해 소리 치는 것을들은 적이 없다. 자신의 코드가 실제로 컴파일되는 것을 깨닫거나 알고 있다면이 광대의 얼굴을보고 싶습니다.
— Josh Stodola

22

추악하지만 적어도 올바른 날짜를 돌려줍니다.

시스템에 의해 설정된 시작 시간 :

    public static DateTime FirstDateInWeek(this DateTime dt)
    {
        while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
            dt = dt.AddDays(-1);
        return dt;
    }

없이:

    public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
    {
        while (dt.DayOfWeek != weekStartDay)
            dt = dt.AddDays(-1);
        return dt;
    }

3
이것은 단순성과 가독성에 대해 더 많은 투표를 할 가치가 있습니다.
— ProfK

이 리소스도 도움 : markb.uk/...을 (일주일 또는 월의 첫 번째 / 마지막 날을 얻고 싶은 경우에).
— FranzHuber23

13

문화 안전 답변과 확장 방법 답변을 결합합시다.

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
        return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow));
    }
}

12
DT도 startOfWeek가 함수 내에서 사용되는 아니, 내가 첫 번째 대신 DateTime.Today 사용해야합니다 생각
— hultqvist

2
질문의 맥락에서 .Today 또는 .Now와 같은 방식으로 Datetime 이외의 추가 속성을 사용하려고합니다. 나는 이것이 어색하다는 데 동의하지만 그것은 요청 된 것입니다.
— Joel Coehoorn

7
나는 이것이 오래된 대답이라는 것을 알고 있지만 많은 수준에서 잘못되었습니다. 메서드 인수를 완전히 무시하는 것 외에도 수학은 많은 경우 미래의 날짜 를 선택하게합니다 . 이것은 , dt대신에 사용 하도록, 음의 오프셋을 보장하기 위해 DateTime.Today수학을 래핑하고 , 현재 문화권을 인수 로 전달 (offset + 7) % 7하는 단일 매개 변수 메소드 과부하 를 사용하고 (사양에 따라) 가능한 "마지막 화요일"이 이미 화요일 인 경우 오늘을 반환하지 않도록 7 일 오프셋으로 0을 오프셋합니다. FirstDayOfWeekstartOfWeek
— Aaronaught

10

이것은 당신에게 이전 일요일을 줄 것입니다 (제 생각에) :

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);

9

이것은 약간의 해킹 일 수 있지만 .DayOfWeek 속성을 int로 캐스팅 할 수 있습니다 (열거이며 기본 데이터 유형이 기본 값으로 int로 변경되지 않았기 때문에 기본으로 int로 변경).이를 사용하여주의 이전 시작을 결정하십시오. .

DayOfWeek 열거 형에 지정된 주가 일요일에 시작하는 것으로 보이므로이 값에서 1을 빼면 월요일이 현재 날짜 이전의 며칠과 같습니다. 또한 일요일 (0)을 7로 매핑해야하므로 1-7 = -6 일요일은 이전 월요일에 매핑됩니다.

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);

이전 일요일의 코드는이 조정을하지 않아도되므로 더 간단합니다.

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);

9

월요일

DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);

일요일

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);

1
다른 응용 프로그램이 필요했지만 이것을 사용하여 나에게 나아갔습니다. 나는 캐스팅이없는 가장 간단한 것이므로 작업을 동일하거나 적절한 유형으로 유지하기 때문에 좋아합니다.
— qxotk

1
하루가 일요일이면 작동하지 않습니다. 이번 주 시작이 아닌 다음 월요일을 제공합니다.
— 그랜트 J

또한 일요일이나 월요일을 복사 했습니까? 나는 당신이 월요일에 원한다면 2 답변 하나를 가지고 당신이 일요일에 원한다면 2on ..... 방금 테스트했고 그것은 나에게 잘 작동합니다. DateTime.Now.DayOfWeek; 일요일 및 결과 DateTime.Now.AddDays (DayOfWeek.Sunday-DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 μμ} 날짜 : {10/11/2019 12:00:00 πμ} 일 : 10 DayOfWeek : 일요일 DayOfYear : 314 시간 : 16 종류 : 로컬 밀리 초 : 172 분 : 14 개월 : 11 초 : 55 틱 : 637089992951723516 TimeOfDay : {16 : 14 : 55.1723516} 년 : 2019
— George Stavrou

@GrantJ 어떤 라인을 사용하셨습니까 ??? 방금 테스트했으며 정상적으로 작동합니다.
— George Stavrou

2019 년 11 월 10 일 일요일을 나타내는 DateTime으로 DateTime.Now를 대체하여 첫 번째 것을 시도했습니다 .2019
— 그랜트 J

5
using System;
using System.Globalization;

namespace MySpace
{
    public static class DateTimeExtention
    {
        // ToDo: Need to provide culturaly neutral versions.

        public static DateTime GetStartOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek));
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0);
        }

        public static DateTime GetEndOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.GetStartOfWeek().AddDays(6);
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999);
        }

        public static DateTime GetStartOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetStartOfWeek();
        }

        public static DateTime GetEndOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetEndOfWeek();
        }
    }
}

3
우선, 커뮤니티에 오신 것을 환영합니다 :)이 질문에 대한 몇 가지 고품질 답변이 이미 있습니다. 그 중 대부분은 7 년 전에 질문을 받았을 때 게시되었습니다. 프로그래밍 능력을 향상시키기 위해 이와 같은 간단한 질문에 대답하려고 시도하는 것이 가치가 있지만,이 답변을 현재 상태로 게시해도 질문에 아무 것도 추가되지 않습니다. 답변에 소설이있는 경우, 몇 가지 문장을 통해 어떻게 다른지, 왜 더 나은지 설명하십시오.
— MTCoster

4

세계화와 함께 모든 것을 통합하고 전화의 일부로 요일을 지정할 수 있습니다.

public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek )
{
    DayOfWeek fdow;

    if ( firstDayOfWeek.HasValue  )
    {
        fdow = firstDayOfWeek.Value;
    }
    else
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        fdow = ci.DateTimeFormat.FirstDayOfWeek;
    }

    int diff = dt.DayOfWeek - fdow;

    if ( diff < 0 )
    {
        diff += 7;
    }

    return dt.AddDays( -1 * diff ).Date;

}

4
var now = System.DateTime.Now;

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;

2

이렇게하면주의 첫 번째 일요일 자정이됩니다.

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);

이것은 자정 첫 월요일에 제공됩니다.

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);

2

이 코드를 사용하면 주어진주의 첫 번째 날짜와 마지막 날짜를 모두 얻을 수 있습니다. 여기서는 일요일이 첫날이고 토요일이 마지막 날이지만 문화에 따라 두 날짜를 모두 설정할 수 있습니다

DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date,DayOfWeek.Sunday);
DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday);

public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime firstDayInWeek = dayInWeek.Date;
    while (firstDayInWeek.DayOfWeek != firstDay)
        firstDayInWeek = firstDayInWeek.AddDays(-1);

    return firstDayInWeek;
}
public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime lastDayInWeek = dayInWeek.Date;
    while (lastDayInWeek.DayOfWeek != firstDay)
        lastDayInWeek = lastDayInWeek.AddDays(1);

    return lastDayInWeek;
}

2

월요일에 시작하여 일주일 동안 문제를 해결하지 못하여 일요일에 일요일이 다가 왔습니다. 그래서 약간 수정 하고이 코드로 작업했습니다.

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;

'다가오는 월요일'의 문제는 문화에 달려있는 것 같습니다 (Eric의 답변 및 Cerveser의 의견 참조). 그러나 일요일을 보통의 비즈니스 약속과 같이 고려할 필요가없는 경우 공식은 다음을 수행 할 수 있습니다. 단순화 :dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
— 데미안 보글

2

1 단계 : 정적 클래스 만들기

  public static class TIMEE
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
    public static DateTime EndOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 - (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(1 * diff).Date;
    }
}

2 단계 :이 수업을 사용하여 요일의 시작과 끝을 모두 얻습니다.

 DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
        DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);

(6 - (dt.DayOfWeek - startOfWeek)) % 7내가 작성한 단위 테스트에 대해 주말이 필요 했습니다.
— mlhDev

1

다음 방법은 원하는 DateTime을 반환해야합니다. 일요일이 요일의 첫날이되면 true로, 월요일의 경우 false로 전달합니다.

private DateTime getStartOfWeek(bool useSunday)
{
    DateTime now = DateTime.Now;
    int dayOfWeek = (int)now.DayOfWeek;

    if(!useSunday)
        dayOfWeek--;

    if(dayOfWeek < 0)
    {// day of week is Sunday and we want to use Monday as the start of the week
    // Sunday is now the seventh day of the week
        dayOfWeek = 6;
    }

    return now.AddDays(-1 * (double)dayOfWeek);
}

1

예제 주셔서 감사합니다. 나는 항상 "CurrentCulture"요일을 항상 사용해야했고 배열의 경우 정확한 Daynumber를 알아야했습니다. 첫 번째 확장은 다음과 같습니다.

public static class DateTimeExtensions
{
    //http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week
    //http://stackoverflow.com/questions/1788508/calculate-date-with-monday-as-dayofweek1
    public static DateTime StartOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }

    public static int DayNoOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return diff + 1; //Make it 1..7
    }
}

1

아직 아무도 정확하게 대답하지 않은 것 같습니다. 누군가가 필요로하는 경우 여기에 솔루션을 붙여 넣을 것입니다. 다음 코드는 요일이 월요일인지 일요일인지에 관계없이 작동합니다.

public static class DateTimeExtension
{
  public static DateTime GetFirstDayOfThisWeek(this DateTime d)
  {
    CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    var first = (int)ci.DateTimeFormat.FirstDayOfWeek;
    var current = (int)d.DayOfWeek;

    var result = first <= current ?
      d.AddDays(-1 * (current - first)) :
      d.AddDays(first - current - 7);

    return result;
  }
}

class Program
{
  static void Main()
  {
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine("Current culture set to en-US");
    RunTests();
    Console.WriteLine();
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK");
    Console.WriteLine("Current culture set to da-DK");
    RunTests();
    Console.ReadLine();
  }

  static void RunTests()
  {
    Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd"));
    Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek());
    Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek());
    Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek());
  }
}

1

C #의 Modulo는 -1mod7 (6이어야 함, c #은 -1을 반환)에 대해 잘못 작동하므로 "oneliner"솔루션은 다음과 같습니다.

private static DateTime GetFirstDayOfWeek(DateTime date)
    {
        return date.AddDays(-(((int)date.DayOfWeek - 1) - (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7));
    }

1

일주일 동안 동일합니다 (@Compile 스타일).

    public static DateTime EndOfWeek(this DateTime dt)
    {
        int diff = 7 - (int)dt.DayOfWeek;

        diff = diff == 7 ? 0 : diff;

        DateTime eow = dt.AddDays(diff).Date;

        return new DateTime(eow.Year, eow.Month, eow.Day, 23, 59, 59, 999) { };
    }

0

훌륭한 우산 라이브러리를 사용할 수 있습니다 .

using nVentive.Umbrella.Extensions.Calendar;
DateTime beginning = DateTime.Now.BeginningOfWeek();

그러나, 그들은 않는 주 (속성을 참조 첫날 월요일 저장 것으로 보인다 nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn이전 지역화 된 솔루션은 조금 더 그래서,). 불행한 사람.

편집 : 질문을 자세히 보면 우산이 실제로 작동하는 것처럼 보입니다.

// Or DateTime.Now.PreviousDay(DayOfWeek.Monday)
DateTime monday = DateTime.Now.PreviousMonday(); 
DateTime sunday = DateTime.Now.PreviousSunday();

월요일에 이전 월요일을 요청하면 7 일이 지난다는 사실에 주목할 가치가 있습니다. 그러나 BeginningOfWeek버그 를 사용 하는 것처럼 보이는 경우에도 마찬가지 입니다.


0

그러면 주 시작과 주 종료 날짜가 모두 반환됩니다.

    private string[] GetWeekRange(DateTime dateToCheck)
    {
        string[] result = new string[2];
        TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day 
        DateTime dateRangeBegin = dateToCheck;
        DateTime dateRangeEnd = DateTime.Today.Add(duration);

        dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
        dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);

        result[0] = dateRangeBegin.Date.ToString();
        result[1] = dateRangeEnd.Date.ToString();
        return result;

    }

내 블로그 ZamirsBlog 에 시작 / 종료, 월, 분기 및 연도 계산을위한 전체 코드를 게시 했습니다.


0
    namespace DateTimeExample
    {
        using System;

        public static class DateTimeExtension
        {
            public static DateTime GetMonday(this DateTime time)
            {
                if (time.DayOfWeek != DayOfWeek.Monday)
                    return GetMonday(time.AddDays(-1)); //Recursive call

                return time;
            }
        }

        internal class Program
        {
            private static void Main()
            {
                Console.WriteLine(DateTime.Now.GetMonday());
                Console.ReadLine();
            }
        }
    } 

코드에 대한 설명을 포함하도록 답변을 확장 할 수 있습니까? 생각보다 독자에게 도움이됩니다.
— gunr2171

재귀를 사용하는 것은 구현이 매우 좋지 않습니다. 재귀를 사용할 수 있다고해서 꼭해야하는 것은 아닙니다. 여기에 제공된 다른 솔루션보다 속도가 느리고 메모리를 많이 사용합니다.
— mikecamimo

0

다음은 몇 가지 답변의 조합입니다. 문화를 전달할 수있는 확장 방법을 사용합니다. 문화가 전달되지 않으면 현재 문화권이 사용됩니다. 이를 통해 최대한의 유연성과 재사용이 가능합니다.

/// <summary>
/// Gets the date of the first day of the week for the date.
/// </summary>
/// <param name="date">The date to be used</param>
/// <param name="cultureInfo">If none is provided, the current culture is used</param>
/// <returns>The date of the beggining of the week based on the culture specifed</returns>
public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) =>         
             date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo??CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;

사용법 예 :

public static void TestFirstDayOfWeekExtension() {          
        DateTime date = DateTime.Now;
        foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) {
            Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}");
        }
    }

0

토요일이나 일요일 또는 요일을 원하지만 현재 주를 초과하지 않는 경우 (토요일)이 코드로 덮여 있습니다.

public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day)
{
    var temp = date;
    var limit = (int)date.DayOfWeek;
    var returnDate = DateTime.MinValue;

    if (date.DayOfWeek == day) return date;

    for (int i = limit; i < 6; i++)
    {
        temp = temp.AddDays(1);

        if (day == temp.DayOfWeek)
        {
            returnDate = temp;
            break;
        }
    }
    if (returnDate == DateTime.MinValue)
    {
        for (int i = limit; i > -1; i++)
        {
            date = date.AddDays(-1);

            if (day == date.DayOfWeek)
            {
                returnDate = date;
                break;
            }
        }
    }
    return returnDate;
}

0

우리는 원 라이너를 좋아합니다 : 현재 문화의 첫날과 오늘의 차이를 얻은 다음 현재 날짜에서 일 수를 뺍니다.

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));

0

Compile This 'Answer에서 다음 요일을 사용하여 요일을 구하십시오.

public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{            
    int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
    var monday = dt.AddDays(-1 * diff).Date;

    switch (day)
    {
        case DayOfWeek.Tuesday:
            return monday.AddDays(1).Date;

        case DayOfWeek.Wednesday:
            return monday.AddDays(2).Date;

        case DayOfWeek.Thursday:
            return monday.AddDays(3).Date;

        case DayOfWeek.Friday:
            return monday.AddDays(4).Date;

        case DayOfWeek.Saturday:
            return monday.AddDays(5).Date;

        case DayOfWeek.Sunday:
            return monday.AddDays(6).Date;
    }

    return monday;
}

0

재귀를 사용하는 함수를 작성하십시오. DateTime 객체는 입력이며 함수는 주 시작을 나타내는 새로운 DateTime 객체를 반환합니다.

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }

이 코드가 문제를 해결하는 방법과 이유에 대한 설명 을 포함 하여 질문을 해결할 수는 있지만 게시물의 품질을 향상시키는 데 도움이되며 더 많은 투표를 할 수 있습니다. 지금 질문하는 사람이 아니라 독자들에게 질문에 대답하고 있음을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
— David Buck

0

이 방법으로 계산하면 새 요일의 시작을 나타내는 요일 (월요일을 선택한 예)을 선택할 수 있습니다.

월요일 인 날짜에 대해이 계산을 수행 하면 이전 월요일이 아닌 현재 월요일 이 제공됩니다 .

//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;

//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;

//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;

DateTime previousStartOfWeek = inputDate.AddDays(-daysSinceStartOfWeek);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.