Sudost/lichost týdne – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Sudost/lichost týdne – .NET – Fórum – Programujte.comSudost/lichost týdne – .NET – Fórum – Programujte.com

 

Mrakoplas0
Newbie
13. 3. 2008   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 88.100.5.–
Kdo uteče vyhraje :-D
DeaLer+2
Hero
13. 3. 2008   #2
-
0
-

To Mrakoplas : Hledal jsem, ale nenašel jsem, že by to .NET nějake řešil.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Mrakoplas0
Newbie
13. 3. 2008   #3
-
0
-

já jsem právě také hledal a nenašel. Asi to vazne .NET neresi :-/

Nahlásit jako SPAM
IP: 88.100.5.–
Kdo uteče vyhraje :-D
21. 3. 2008   #4
-
0
-

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);
}
}
}

Nahlásit jako SPAM
IP: 194.213.32.–
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 24 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý