Data si timpul in .Net
In orice limbaj de programare si in orice program, la un moment dat este necesara folosirea datei sau timpului si diverselor operatii cu acestea. In .Net exista o structura specializata care se ocupa de data si timp, DateTime. Lucrul cu structura DateTime este simplu, intuitiv.
Exista 12 constructori in structura DateTime, si cateva metode (proprietati) statice care permit crearea sau obtinerea unei instante a acestei structuri. Toate posibilitatile de obtinere a unui obiect de tip DateTime prin folosirea contructorului sunt prezentate pe msdn aici. In afara de aceasta cale, mai exista si alte posibilitati de a obtine un obiect de tip DateTime:
1. DateTime d = DateTime.Now; 2. DateTime d = DateTime.Today; 3. DateTime d = DateTime.UtcNow; 4. DateTime d = DateTime.Parse(dateAsString);
…si altele.
Interfetele implementate de DateTime sunt: IComparable, IComparable
Astazi voi scrie cateva exemple de cod care folosesc anumite operatii cu data – pe principiul ca un exemplu e mai bun decat 2 pagini de teorie!Asadar, programul pe care l-am scris demonstreaza folosirea anumitor operatii simple cu date. Voi posta in continuare codul c# si apoi voi face cateva remarci pe marginea codului, desi codul este destul de bine comentat. Codul este impartit in mai multe metode, pentru a usura intelegerea lui (sper ca aceasta fragmentare sa nu ingreuneze citirea!).
using System; namespace zeltera.DateTimeDemo { static class DateTimeDemo { static Random rnd = new Random(); static void Main(string[] args) { PrintDate(); PrintYesterday(); PrintTomorrow(); Console.Write("Azi este: "); PrintDayName(DateTime.Today); Console.Write("Prima zi din an a fost "); PrintDayName(new DateTime(DateTime.Now.Year, 1, 1)); Console.Write("Ultima zi din acest an va fi "); PrintDayName(new DateTime(DateTime.Now.Year, 12, 31)); for (int i = 0; i < 25; i++) { Console.WriteLine(i + ". Random date: " + GetRandomDate().ToShortDateString()); } Console.WriteLine("\n---------\n"); // Diferenta dintre doua date DateTime d1 = GetRandomDate(); DateTime d2 = GetRandomDate(); TimeSpan ts = d1 > d2 ? d1 - d2 : d2 - d1; Console.WriteLine("Diferenta dintre {0} si {1} este de {2} zile", d1.ToShortDateString(), d2.ToShortDateString(), ts.Days); Console.ReadKey(); } /// <summary> /// Afiseaza data de astazi /// </summary> static void PrintDate() { Console.WriteLine("Astazi: " + DateTime.Now.ToString()); } /// <summary> /// Afiseaza data de ieri /// </summary> static void PrintYesterday() { Console.WriteLine("Data de ieri: " + DateTime.Now.AddDays(-1).ToShortDateString()); } /// <summary> /// Afiseaza data de maine /// </summary> static void PrintTomorrow() { Console.WriteLine("Data de ieri: " + DateTime.Now.AddDays(1).ToShortDateString()); } /// <summary> /// Afiseaza numele zilei pentru o data specifica /// </summary> /// <param name="d"></param> static void PrintDayName(DateTime d) { Console.WriteLine(d.DayOfWeek.ToString()); } static DateTime GetRandomDate() { int d, m, y; m = rnd.Next(1, 13); y = rnd.Next(1900, DateTime.Now.Year + 1); while (true) { try { d = rnd.Next(1, 32); return new DateTime(y, m, d); } catch (Exception ex) { //exceptie apare numai in cazul in care ziua este o valoare nepermisa pentru luna //respectiva. Daca luna admite numai 30 de zile, si numarul random generat pentru //data este 31, o exceptie este aruncata. //Exista si alte posibilitati (generarea datei in functie de luna pentru care se //genereaza ziua, insa am ales sa nu folosesc aceasta varianta. continue; } } } } }
Un posibil rezultat al executiei acestui program este:
Astazi: 4/6/2010 10:56:27 PM Data de ieri: 4/5/2010 Data de ieri: 4/7/2010 Azi este: Tuesday Prima zi din an a fost Friday Ultima zi din acest an va fi Friday 0. Random date: 12/2/1911 1. Random date: 11/15/1935 2. Random date: 7/14/1953 3. Random date: 8/30/1965 4. Random date: 4/19/1919 5. Random date: 1/1/1927 6. Random date: 7/4/2004 7. Random date: 7/20/1909 8. Random date: 9/6/1907 9. Random date: 12/13/1943 10. Random date: 10/19/1972 11. Random date: 12/14/1997 12. Random date: 5/24/1936 13. Random date: 2/28/1938 14. Random date: 12/5/1959 15. Random date: 2/16/1970 16. Random date: 1/18/1984 17. Random date: 2/14/1900 18. Random date: 5/14/1902 19. Random date: 2/10/1928 20. Random date: 8/2/1909 21. Random date: 10/11/2003 22. Random date: 4/6/1933 23. Random date: 8/8/2001 24. Random date: 5/7/1966 --------- Diferenta dintre 8/15/1960 si 8/21/1948 este de 4377 zile
Asadar, am scris o serie de metode care executa tascuri simple:
- PrintDate – afiseaza data de astazi. Instanta DateTime este obtinuta folosing proprietatea statica Now
- PrintYesterday – afiseaza data de ieri, pentru a demontra folosirea metodei AddDays
- PrintTomorrow – afiseaza data de maine
- PrintDayName – afiseaza numele zilei (in engleza) al datei transmise ca argument
- GetRandomDate – genereaza o data aleatoare
- diferenta dintre doua date (exprimata in zile) – calculeaza diferenta dintre doua date si afiseaza rezultatul ca numar de zile. Aici se poate vedea si folosirea compararii a doua date: TimeSpan ts = d1 > d2 ? d1 – d2 : d2 – d1;
Cam atat, deocamdata despre lucrul cu data (cu timpul se lucreaza in mod asemanator). Intr-unul din articolele urmatoare voi vorbi despre foramtarea pentru afisare a unei instante a DateTime.
Mihaela says:
Am si eu o intrebare…
Eu am un proiect de web design in c#, care consta in rezolvarea unor teste. Cum pot sa retin ora la care se incepe testul? Am incercat cu Session si cu DateTime.now, dar imi afiseaza mereu numai ora la care fac a doua oara compararea. Am incercat si sa le trimit ca string-uri ca parametru, dar n-am reusit sa il pacalesc.
Ma poti ajuta?
Multumesc anticipat!
zeltera says:
Tu ai o problema de implementare. Nu prea inteleg despre ce e vorba in problema ta, cred ca ai putea sa procedezi in felul urmator: prima data cand testul este generat salvezi timpul in Session. Numai prima data. Cum stii ca e prima data? Ai in asp.net o proprietate (daca tin minte bine) a Request numita IsPostBack. Foloseste-o. Numai la prima incarcare a unei pagini aceasta proprietate este false.