Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Data si timpul in .Net

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, IFormattable si IConvertible.

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:

  1. PrintDate – afiseaza data de astazi. Instanta DateTime este obtinuta folosing proprietatea statica Now
  2. PrintYesterday – afiseaza data de ieri, pentru a demontra folosirea metodei AddDays
  3. PrintTomorrow – afiseaza data de maine
  4. PrintDayName – afiseaza numele zilei (in engleza) al datei transmise ca argument
  5. GetRandomDate – genereaza o data aleatoare
  6. 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.

Category: Uncategorized
  • 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!

    May 22, 2012 at 12:16 pm
    • 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.

      June 15, 2012 at 8:08 pm

Your email address will not be published. Required fields are marked *

*