Přeji přijemný den, mám takový problém. Potřeboval bych pomoct se sudostí/lichostí týdne. Existuje nejaká metoda která řeší tento problém, nebo jak to vyřešit jinak. Poroblém je následující: Dejme tomu že je 1.1. XXXX neděle, některé státy to řeší tak:
1. Tento samotný je jako 1. týden v roce
2. Tento den se počíta do nasledujicího týdne roku (tnz.: že 1. 2. 3. 4. 5. 6. 7. 8. je jeden týden)
3. Tento den se počíta do posledního týdne předcházejícího roku. Takže 1. týden roku XXXX začína 2.
Potřeboval bych aby to řesil za me samotný framework. Doposud to počítam sám, s možností č. 2.
Dekuji za pomoc.
Fórum › .NET
Sudost/lichost týdne
To Mrakoplas : Hledal jsem, ale nenašel jsem, že by to .NET nějake řešil.
Dušan Janošík | web: djanosik.cz, @djanosik
To Mrakoplas : Posilam kod z knihy "C# 2005 Velka kniha reseni"(Jurgen Bayer) , mozna ze by se mohl hodit..
using System;
using System.Globalization;
namespace Addison_Wesley.Codebook.DateAndTime
{
public class DateUtils
{
/// <summary>
/// Obsahuje data kalendářního týdne
/// </summary>
public class CalendarWeek
{
/// <summary>
/// Rok
/// </summary>
public int Year;
/// <summary>
/// Kalendářní týden
/// </summary>
public int Week;
/// <summary>
/// Konstruktor
/// </summary>
/// <param name="year">Rok</param>
/// <param name="week">Kalendářní týden</param>
public CalendarWeek(int year, int week)
{
this.Year = year;
this.Week = week;
}
}
/// <summary>
/// Vypočte Kalendářní týden mezinárodního data
/// </summary>
/// <param name="date">Datum</param>
/// <returns>Vrací objekt typu CalendarWeek</returns>
/// <remarks>
/// Tato metoda vypočte kalendářní týden k datu
/// pomocí metody GetWeekOfYear objektu typu Calendar
/// a koriguje v něm obsaženou chybu.
/// </remarks>
public static CalendarWeek GetCalendarWeek(DateTime date)
{
// Zjištění aktuální kultury
CultureInfo currentCulture = CultureInfo.CurrentCulture;
// Zjištění aktuálního kalendáře
Calendar calendar = currentCulture.Calendar;
// Zjištění kalendářního týdne pomocí objektu typu Calendar
int calendarWeek = calendar.GetWeekOfYear(date,
currentCulture.DateTimeFormat.CalendarWeekRule,
currentCulture.DateTimeFormat.FirstDayOfWeek);
// Testuje, zda je kalendářní týden větší než 52
// a zjistí, zda je kalendářní týden k danému datu
// ve druhém týdnu: V takovém případě
// GetWeekOfYear nespočítá datum podle ISO
// (např. pondělí 31.12.2007 bude chybně stanoveno
// jako datum v 53. kalendářním týdnu).
// V takovém případě se týden změní na 1.
if (calendarWeek > 52)
{
date = date.AddDays(7);
int testCalendarWeek = calendar.GetWeekOfYear(date,
currentCulture.DateTimeFormat.CalendarWeekRule,
currentCulture.DateTimeFormat.FirstDayOfWeek);
if (testCalendarWeek == 2)
calendarWeek = 1;
}
// Rok odpovídající kalendářnímu týdnu
int year = date.Year;
if (calendarWeek == 1 && date.Month == 12)
year++;
if (calendarWeek >= 52 && date.Month == 1)
year--;
// Vrácení zjištěného kalendářního týdne
return new CalendarWeek(year, calendarWeek);
}
/// <summary>
/// Vypočte kalendářní týden k českému datu
/// </summary>
/// <param name="date">Datum</param>
/// <returns>Vrátí objekt typu CalendarWeek</returns>
/// <remarks>
/// <para>
/// Tato metoda funguje jen v některých kulturách.
/// (Původně byla navržena pro německou kulturu.)
/// Je ale možná rychlejší než
/// <see cref="GetInternationalCalendarWeek"/>.
/// </para>
/// <para>
/// Výpočet se opírá o algoritmus v
/// C++ od Ekkeharda Hesse z příspěvku z
/// 29.7.1999 v diskusní skupině
/// borland.public.cppbuilder.language
///(je k volnému použití).
/// </para>
/// </remarks>
public static CalendarWeek GetCzechCalendarWeek(DateTime date)
{
double a = Math.Floor((14 - (date.Month)) / 12D);
double y = date.Year + 4800 - a;
double m = (date.Month) + (12 * a) - 3;
double jd = date.Day + Math.Floor(((153 * m) + 2) / 5) +
(365 * y) + Math.Floor(y / 4) - Math.Floor(y / 100) +
Math.Floor(y / 400) - 32045;
double d4 = (jd + 31741 - (jd % 7)) % 146097 % 36524 %
1461;
double L = Math.Floor(d4 / 1460);
double d1 = ((d4 - L) % 365) + L;
// Zjištění kalendářního týdne
int calendarWeek = (int)Math.Floor(d1 / 7) + 1;
// Zjištění roku kalendářního týdne
int year = date.Year;
if (calendarWeek == 1 && date.Month == 12)
year++;
if (calendarWeek >= 52 && date.Month == 1)
year--;
// Vrácení výsledku
return new CalendarWeek(year, calendarWeek);
}
}
}
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 53 hostů
Podobná vlákna
Článek týdne — založil pawlik
Zjištění začátku a konce týdne — založil Pavelv
Publikace c++ za 21 dní - opakování prvního týdne — založil miguel
Moderátoři diskuze