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


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.