петак, 29. јануар 2016.

DateTime struktura, rad sa datumima i vremenom u C# programskom jeziku


Za razliku od klase String koja predstavlja rad sa tekstom i klase Math koja predstavlja rad sa matematičkim formulama, DateTime struktura predstavlja rad sa datumima i vremenom. Međutim, DateTime nije klasa već struktura. To znači da DateTime nije referentni tip podataka, već vrednosni tip podataka. To takođe znači, da kad god radite sa datumima; u memoriji se pravi nova instanca strukture DateTime što može uticati na performanse programa. U C# programskom jeziku ne postoji Date tip podataka kao u Visual Basic-u već je Date samo properti strukture DateTime.


( Za datum i vreme se koristi DateTime struktura u C# programskom jeziku )

DateTime struktura nije nullable tip podataka i nema vrednost null.

Type type = typeof(DateTime);
if (type.IsValueType) WriteLine("True"); else WriteLine("False");  // Result True

Ukoliko ne izvršite inicijalizaciju strukture DateTime, jednostavno će te dobiti minimalnu vrednost.

DateTime date = new DateTime();
WriteLine(date.ToString()); // 1/1/0001 12:00:00 AM
WriteLine(DateTime.MaxValue.ToString()); // 12/31/9999 11:59:59 PM   

U situacijama kad vam treba datum koji će predstavljati vrednost sa kojom možete reći korisniku da datum nije pronađen, ili da hoćete da je datum jednak 0; što nije moguće za strukturu DateTime u kodiranju; tada koristite minimalnu vrednost strukture DateTime.

if (date == DateTime.MinValue) WriteLine("False"); else WriteLine("True"); // Result False

Kako da inicijalizujemo neki određen datum? 
 
Postoji više načina da se inicijalizuje određeni datum u zavisnosti šta vam konkretno treba.

date = new DateTime(2016, 1, 14); // Serbian New Year
date = DateTime.Now; // Now
date = DateTime.UtcNow; // UTC
date = DateTime.Today; // Today
date = DateTime.Today.AddDays(-1); // Yesterday
date = DateTime.Today.AddDays(+1); // Tomorrow

Ukoliko želite da prikažete datum, kako se prikazuje na srpskom jeziku, neophodno je da koristite metodu CreateSpecificCulture klase CultureInfo:

WriteLine(date.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("sr-SR")));

Da bi ste prikazali samo vreme bez datuma ili datum bez vremena, tada možete da koristite String formate za određen prikaz ili da koristite propertije strukture DateTime.

WriteLine("Date: " + date.Date);
WriteLine("Date: " + date.ToString("MM.dd.yyyy")); 
WriteLine("Time: " + date.TimeOfDay);
WriteLine("Time: " + date.ToString("hh:mm:ss"));

U projektima ljudi imaju često potrebu za prvim datumom u godini ili mesecu radi finansijski proračuna. U ovakvoj situaciji možete koristiti ovakav trik.

date = new DateTime(date.Year, 1, 1);

Prestupna godina je godina u kojoj mesec Februar ima 29 dana. U principu to je svaka godina deljiva sa 4, ali vi imate metodu IsLeapYear da vam potvrdi da li je godina prestupna.

WriteLine(DateTime.IsLeapYear(date.Year).ToString());  

Svaki unos korisnika sa konzole je tipa string. Tako i datumi u ulazu su tipa string i zbog toga je neophodno da vaš string pretvorite u DateTime strukturu podataka. Za takvu svrhu je najbolje da koristite metodu TryParse, koja će proveriti da li je korisnik ukucao datum ili nije.


( String formati u C# programskom jeziku za prikaz datuma )

Struktura DateTime podržava mnoge string formate za datum i zato kad dodelite i datum koji nije u kraćem formatu, on će biti prihvaćen.

string birth = "9/1/1975 12:15:00 AM";
bool correct = DateTime.TryParse(birth, out date);
if(correct) WriteLine("Manuel's date of birth: " + date);

Pogledajte kako da prikažete samo određene članove datuma ili vremena. Za primer sam stavio svoj vlastiti datum rođenja. 1 Septembar 1975 godine u 0:15 časova.

WriteLine(date.DayOfWeek); // Monday
WriteLine(date.Day); // 1
WriteLine(date.Month + " or " + date.ToString("MMMM")); // 9 or September
WriteLine(date.Year); // 1975

WriteLine(date.Hour); // 0
WriteLine(date.Minute); // 15
WriteLine(date.Second); // 0

Ukoliko na primer želim da znam koliko upravo imam minuta umesto godina, to se takođe može izvesti malim trikom.

TimeSpan old = DateTime.Today - date;
WriteLine(old.TotalMinutes); // 21252945 Minutes

U ovom postu sam vam predstavio samo neke osnovne mogućnosti koje možete da uradite zahvaljujući strukturi DateTime, inače bi se mogla napisati cela knjiga na ovu temu koliko samo postoji kombinacija String formata za datume i vreme. Zato vam savetujem da malo istražujete MSDN - Microsoft Developer Network biblioteku. Prekucajte sebi sledeći kod programa; skoro u većini programerski poslova će se od vas tražiti da u vašem kodu radite sa vremenom i datumima.

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateTimeStructure
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("DATETIME STRUCT" + Environment.NewLine);

            // Check for DateTime type
            Write("Is DateTime value type? ");
            Type type = typeof(DateTime);
            if (type.IsValueType) WriteLine("True"); else WriteLine("False"); // Result True

            // Minimum and Maximum value of the DateTime struct
            DateTime date = new DateTime();
            WriteLine(Environment.NewLine + "Minimum DateTime value: " + date.ToString()); // 1/1/0001 12:00:00 AM
            WriteLine("Maximum DateTime value: " + DateTime.MaxValue.ToString()); // 12/31/9999 11:59:59 PM

            // Use Minimum value of DateTime for no date!
            Write(Environment.NewLine + "Is there date? ");
            if (date == DateTime.MinValue) WriteLine("False"); else WriteLine("True");

            // Initialize date
            date = new DateTime(2016, 1, 14);
            WriteLine(Environment.NewLine + "Initialize date: " + date);
            WriteLine("Initialize date for Serbia: " + date.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("sr-SR")));
            date = DateTime.Now;
            WriteLine(Environment.NewLine + "Day Now: " + date);
            date = DateTime.UtcNow;
            WriteLine("Day Now UTC: " + date + Environment.NewLine);
            date = DateTime.Today;
            WriteLine("Today: " + date);
            date = DateTime.Today.AddDays(-1);
            WriteLine("Yesterday: " + date);
            date = DateTime.Today.AddDays(+1);
            WriteLine("Tomorrow: " + date);

            ReadLine();
            Clear();

            // Present DateTime Properties
            date = new DateTime(date.Year, 1, 1);
            WriteLine("First date in 2016 year: " + date);
            WriteLine("Is leap year: " + DateTime.IsLeapYear(date.Year).ToString() + Environment.NewLine);
         
            string birth = "9/1/1975 12:15:00 AM";
            bool correct = DateTime.TryParse(birth, out date);
            if(correct) WriteLine("Manuel's date of birth: " + date);

            WriteLine("Date: " + date.ToString("MM.dd.yyyy"));  // 9.1.1975
            WriteLine("Time: " + date.ToString("hh:mm:ss tt")); // 12:15:00 AM

            WriteLine(Environment.NewLine + "Day: " + date.DayOfWeek); // Monday
            WriteLine("Day: " + date.Day); // 1
            WriteLine("Month: " + date.Month + " or " + date.ToString("MMMM")); // 9 or September
            WriteLine("Year: " + date.Year); // 1975

            WriteLine(Environment.NewLine + "Hours: " + date.Hour); // 0
            WriteLine("Minutes: " + date.Minute); // 15
            WriteLine("Seconds: " + date.Second + Environment.NewLine); // 0

            TimeSpan old = DateTime.Today - date;
            WriteLine("Manuel is " + old.TotalMinutes + " Minutes old."); // 21252945

            ReadKey();
           
        }
    }
}

Kad pokrenete navedeni program on će vam prikazati slične rezultate:

DATETIME STRUCT

Is DateTime value type? True 

Minimum DateTime value: 1/1/0001 12:00:00 AM
Maximum DateTime value: 12/31/9999 11:59:59 PM 

Is there date? False

Initialize date: 1/14/2016 12:00:00 AM
Initialize date for Serbia: 14.1.2016. 00.00.00

Day Now: 1/28/2016 12:47:31 PM
Day Now UTC: 1/28/2016 11:47:31 AM
Today: 1/28/2016 12:00:00 AM
Yesterday: 1/27/2016 12:00:00 AM
Tomorrow: 1/29/2016 12:00:00 AM
First date in 2016 year: 1/1/2016 12:00:00 AM
Is leap year: True
Manuel's date of birth: 9/1/1975 12:15:00 AM
Date: 09.01.1975
Time: 12:15:00 AM
 
Day: Monday
Day: 1
Month: 9 or September
Year: 1975

Hours: 0
Minutes: 15
Seconds: 0

Manuel is 21252945 Minutes old.

Kako to sve izgleda možete pogledati i na video-u:


( C# 6.0 Tutorial - Fundamentals - 36. DateTime Struct )