Każdy zna łatwy sposób na ustalenie daty pierwszego dnia tygodnia (poniedziałek w Europie). Znam rok i numer tygodnia? Zrobię to w C #.
c#
.net
week-number
Konstabl
źródło
źródło
Odpowiedzi:
Miałem problemy z rozwiązaniem @HenkHolterman, nawet z poprawką @RobinAndersson.
Czytanie o standardzie ISO 8601 ładnie rozwiązuje problem. Jako cel użyj pierwszego czwartku, a nie poniedziałku. Poniższy kod będzie działał również przez 53 tydzień 2009 roku.
źródło
Podoba mi się rozwiązanie dostarczone przez Henka Holtermana. Ale aby być trochę bardziej niezależnym od kultury, musisz wybrać pierwszy dzień tygodnia dla aktualnej kultury (nie zawsze jest to poniedziałek):
źródło
firstMonday
to zła nazwa zmiennej dla czegoś, co może nie być poniedziałkiem. =)AKTUALIZACJA : .NET Core 3.0 i .NET Standard 2.1 są dostarczane z tym typem.
Dobre wieści! Prośba przyciąganie dodanie
System.Globalization.ISOWeek
do .NET Rdzenia właśnie połączyły się i jest obecnie planowana na wydaniu 3.0. Miejmy nadzieję, że rozprzestrzeni się na inne platformy .NET w niezbyt odległej przyszłości.Powinieneś być w stanie użyć
ISOWeek.ToDateTime(int year, int week, DayOfWeek dayOfWeek)
metody, aby to obliczyć.Możesz znaleźć kod źródłowy tutaj .
źródło
Najprościej jest prawdopodobnie znaleźć pierwszy poniedziałek roku, a następnie dodać odpowiednią liczbę tygodni. Oto przykładowy kod. Przy okazji zakłada numer tygodnia zaczynający się od 1:
źródło
Osobiście skorzystałbym z informacji o kulturze, aby poznać dzień tygodnia i przejść do pierwszego dnia tygodnia kultury. Nie jestem pewien, czy dobrze to wyjaśniam, oto przykład:
źródło
używając Fluent DateTime http://fluentdatetime.codeplex.com/
źródło
Zgodnie z normą ISO 8601: 1988 , używaną w Szwecji, pierwszy tydzień roku jest pierwszym tygodniem, który ma co najmniej cztery dni w nowym roku.
Więc jeśli Twój tydzień zaczyna się w poniedziałek, pierwszy czwartek dowolnego roku przypada w ciągu pierwszego tygodnia. Możesz od tego DateAdd lub DateDiff.
źródło
Zakładając, że numer tygodnia zaczyna się od 1
To powinno dać ci pierwszy dzień w danym tygodniu. Nie przeprowadzałem wielu testów, ale wygląda na to, że działa. To mniejsze rozwiązanie niż większość innych, które znalazłem w Internecie, więc chciałem się nim podzielić.
źródło
new DateTime(1,1,YearNumber)
Bezpłatna biblioteka okresów dla platformy .NET obejmuje tydzień klasy zgodności z normą ISO 8601 :
źródło
Ten zadziałał dla mnie, ma również tę zaletę, że oczekuje informacji o kulturze jako parametru do testowania formuły w różnych kulturach. Jeśli jest pusty, pobiera bieżące informacje o kulturze ... prawidłowe wartości to: „it”, „en-us”, „fr”, ... i tak dalej. Sztuczka polega na odjęciu numeru tygodnia pierwszego dnia roku, który może wynosić 1, aby wskazać, że pierwszy dzień przypada w pierwszym tygodniu. Mam nadzieję że to pomoże.
źródło
Oto metoda, która jest zgodna z numerami tygodni używanymi w Google Analytics, a także z tym samym schematem numeracji, którego używaliśmy wewnętrznie w firmie Intel, i jestem pewien, że jest również używany w wielu innych kontekstach.
źródło
Wypróbowałem kilka kodów powyżej i niektóre mają małe błędy, kiedy spróbujesz różnych lat z różnymi początkowymi dniami tygodnia, zobaczysz je, wziąłem kod Jona Skeeta, naprawiłem i działa, bardzo prosty kod.
źródło
Lekko zmieniony kod Mikaela Svensona. Znalazłem tydzień pierwszego poniedziałku i odpowiednio zmieniłem numer tygodnia.
źródło
Tydzień 1 definiuje się jako tydzień rozpoczynający się w poniedziałek i zawierający pierwszy czwartek roku.
źródło
Aby dokonać konwersji w obu kierunkach, zobacz tutaj: artykuł w Wikipedii dotyczący dat tygodniowych ISO
źródło
Poprawiłem trochę rozwiązanie Thomasa z zastąpieniem:
W przeciwnym razie data poprzedzała tydzień.
Dziękuję Thomas, świetna pomoc.
źródło
Użyłem jednego z rozwiązań, ale dało mi to błędne wyniki, po prostu dlatego, że niedziela liczy się jako pierwszy dzień tygodnia.
Zmieniłam:
do:
a teraz działa jak urok.
źródło
Proponowane rozwiązanie nie jest kompletne - działa tylko dla CalendarWeekRule.FirstFullWeek. Inne typy reguł tygodniowych nie działają. Można to zobaczyć za pomocą tego przypadku testowego:
źródło
Stworzyłem dopracowaną wersję proponowanego rozwiązania, która jest prostsza i parametryzuje firstDayOfWeek:
źródło
to moje rozwiązanie, gdy chcemy obliczyć datę podając rok, numer tygodnia i dzień tygodnia.
źródło
Uprościłem kod podany przez Mikaela Svenssona, który jest poprawny dla wielu krajów w Europie.
źródło
Napisałem i przetestowałem następujący kod i dla mnie działa doskonale. Daj mi znać, jeśli ktoś będzie miał z tym problem, również wysłałem pytanie, aby uzyskać najlepszą możliwą odpowiedź. Ktoś może uznać to za przydatne.
źródło
GetFirstDateOfWeekByWeekNumber(2020, 29)
w tygodniu 29 2020 to powraca07/20/2020
. Ale pierwszy dzień 29 tygodnia był07/13/2020
Obecnie nie ma klasy C #, która poprawnie obsługuje numery tygodni ISO 8601. Mimo że możesz utworzyć instancję kultury, poszukać najbliższej rzeczy i poprawić to, myślę, że lepiej jest wykonać pełne obliczenia samodzielnie:
źródło