Clear        


                
                    // DateTime struct (DateTime parçalı değer tipi)

using System.Globalization;

namespace _15_DateTime
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // DateTime tarih ve saat verilerini tutan struct yapıda bir değer tiptir.



            #region Now, Today ve Date Özellikleri
            DateTime simdikiTarihVeSaat = DateTime.Now; // bu satır çalıştığı andaki bilgisayarın tarihini ve saatini alır ve simdikiTarihVeSaat değişkenine atar
            Console.WriteLine(simdikiTarihVeSaat); // konsola örneğin "21.11.2022 18:17:03" yazdırır

            DateTime simdikiTarih = DateTime.Today; // bu satır çalıştığı andaki bilgisayarın tarihini, saatini de tümünü 0 olarak alır ve simdikiTarih değişkenine atar
            Console.WriteLine(simdikiTarih); // konsola örneğin "21.11.2022 00:00:00" yazdırır

            simdikiTarih = simdikiTarihVeSaat.Date; // simdikiTarihVeSaat verisindeki sadece tarih kısmını alır, saatini de tümünü 0 olarak alır ve simdikiTarih değişkenine atar
            Console.WriteLine(simdikiTarih); // konsola örneğin "21.11.2022 00:00:00" yazdırır
            #endregion



            #region Yeni Tarih Oluşturma ve Formatlama
            DateTime tarih1 = new DateTime(2022, 11, 21); // herhangi bir struct tipindeki parçalı verileri oluşturabilmek için new'lemek gerekir
            Console.WriteLine(tarih1); // konsola bilgisayarın bölgesel ayarına göre tarihi formatlayarak yazdırır: "21.11.2022 00:00:00"

            DateTime tarih2 = new DateTime(2022, 11, 21, 18, 23, 59);
            string tarih2formatlanmis = tarih2.ToString("MM/dd/yyyy HH:mm:ss", new CultureInfo("en-US")); 
            // bölgesel ayardan bağımsız istenilen bölgeye göre formatlama yapabilmek için
            // örneğin İngilizce için new CultureInfo("en-US") parametresi kullanılır, Türkçe olsaydı new CultureInfo("tr-TR") kullanılacaktı.
            // MM: iki hane ay, dd: iki hane gün, yyyy: dört hane yıl, HH: iki hane 24 saat, mm: iki hane dakika, ss: iki hane saniye
            Console.WriteLine(tarih2formatlanmis); // konsola İngilizce bölgesel ayarda tarihi formatlayarak yazdırır: "11/21/2022 18:23:59"

            DateTime tarih3 = new DateTime(2022, 11, 21, 18, 35, 41, 567); // 567: istenirse milisaniye parametresi de kullanılabilir
            string tarih3yazi = tarih3.Year + "-" + tarih3.Month + "-" + tarih3.Day + " " + tarih3.Hour + ":" + tarih3.Minute + ":" + tarih3.Second + "." + tarih3.Millisecond;
            // struct tiplerin her bir parçasına özellikler üzerinden ulaşılabilir
            Console.WriteLine(tarih3yazi); // konsola "2022-11-21 18:35:41.567" yazdırır

            Console.WriteLine(tarih3.ToShortDateString()); // konsola kısa formatta ve bilgisayarın bölgesel ayarına göre "21.11.2022" yazdırır
            Console.WriteLine(tarih3.ToLongDateString()); // konsola uzun formatta ve bilgisayarın bölgesel ayarına göre "21 Kasım 2022 Pazartesi" yazdırır
            Console.WriteLine(tarih3.ToShortTimeString()); // konsola kısa formatta "18:35" yazdırır
            Console.WriteLine(tarih3.ToLongTimeString()); // konsola uzun formatta "18:35:41" yazdırır

            DateTime tarih4 = DateTime.Parse("23.11.2022"); // metinsel formatlı tarih verisini bilgisayarın bölgesel ayarına göre kendi içerisinde new'leyerek DateTime tipinde sonuç döner
            Console.WriteLine(tarih4.ToString(new CultureInfo("tr-TR"))); // konsola "23.11.2022 00:00:00" verisini Türkçe bölgesel ayara göre formatlar ve yazdırır

            DateTime tarih5 = DateTime.Parse("23.11.2022 19:26:35", new CultureInfo("tr-TR")); // istenirse saat de kullanılabilir, Türkçe bölgesel ayara göre DateTime verisi döner
            Console.WriteLine(tarih5.ToString(new CultureInfo("en-US"))); // konsola "11/23/2022 7:26:35 PM" verisini İngilizce bölgesel ayara göre formatlar ve yazdırır

            DateTime tarih6 = DateTime.Parse("11/23/2022", new CultureInfo("en-US")); // İngilizce bölgesel ayara göre DateTime verisi döner
            Console.WriteLine(tarih6.ToString("yyyy-MM-dd")); // konsola istenilen özel formatta (SQL formatı) "2022-11-23" verisini yazdırır
            #endregion



            #region Ekleme Methodları
            DateTime simdi = DateTime.Now;
            Console.WriteLine($"Bugün: {simdi}"); // konsola örneğin "Bugün: 23.11.2022 19:39:11" yazdırır
            Console.WriteLine($"Yarın: {simdi.AddDays(1).ToShortDateString()}"); // konsola örneğin "Yarın: 24.11.2022" yazdırır
            Console.WriteLine($"1 hafta öncesi: {simdi.AddDays(-7).ToShortDateString()} {simdi.AddDays(-7).ToLongTimeString()}"); // konsola örneğin "1 hafta öncesi: 16.11.2022 19:39:11" yazdırır
            Console.WriteLine($"6 ay sonrası: {simdi.AddMonths(6).ToShortDateString()}"); // konsola örneğin "6 ay sonrası: 23.05.2023" yazdırır
            Console.WriteLine($"10 yıl öncesi: {simdi.AddYears(-10).ToShortDateString()}"); // konsola örneğin "10 yıl öncesi: 23.11.2012" yazdırır
            Console.WriteLine($"12 saat sonrası: {simdi.AddHours(12).ToString(new CultureInfo("tr-TR"))}"); // konsola örneğin "12 saat sonrası: 24.11.2022 07:39:11" yazdırır
            Console.WriteLine($"Yarım saat öncesi: {simdi.AddMinutes(-30).ToString(new CultureInfo("en-US"))}"); // konsola örneğin "Yarım saat öncesi: 11/23/2022 7:09:11 PM" yazdırır
            #endregion



            #region Kıyaslama İşlemleri
            DateTime date1 = DateTime.Parse("06.09.2015 01:02:03", new CultureInfo("tr-TR"));
            DateTime date2 = DateTime.Parse("29.04.2010 23:59:58", new CultureInfo("tr-TR"));
            if (date1 > date2) // date1 > date2 yerine date1.CompareTo(date2) > 0 da yazılabilir
                Console.WriteLine($"{date1} büyüktür {date2}");
            else if (date1 < date2) // date1 < date2 yerine date1.CompareTo(date2) < 0) da yazılabilir
                Console.WriteLine($"{date1} küçüktür {date2}");
            else if (date1 == date2) // date1 == date2 yerine date1.CompareTo(date2) == 0 veya date1.Equals(date2) de yazılabilir, son koşul olduğundan else'den sonra if'e gerek yoktur
                Console.WriteLine($"{date1} eşittir {date2}");
            // konsola "6.09.2015 01:02:03 büyüktür 29.04.2010 23:59:58" yazdırır
            #endregion



            #region Tarihin Sayısal Kullanımı
            long sayisalTarih = DateTime.Now.Ticks;
            Console.WriteLine(sayisalTarih); // konsola 01.01.0001 00:00:00.000 tarihinden itibaren belirli bir aralıkta ekleme yaparak bugünün tarihini sayısal olarak yazdırır
            #endregion



            // Algoritma Örnek 1: Yaş Hesaplama
            /*
            1. başla
            2. kullanıcıya doğum tarihi Türkçe formatta sorulur, çıkmak için Ç'ye basması gerektiği yazdırılır ve kullanıcıdan doğum tarihi alınır
            3. bir methoda doğum tarihi gönderilerek yaş hesaplanır ve geriye dönülür
            4. geriye dönülen yaş ekrana yazdırılır
            5. 2. adıma dönülür, eğer kullanıcı Ç girerse 6. adıma gidilir
            6. bitiş
            */
            Console.Write("Doğum tarihinizi giriniz (gün.ay.yıl), çıkmak için \"Ç\" tuşuna basınız: ");
            string dogumTarihiGiris = Console.ReadLine();
            int yas;
            while (dogumTarihiGiris.ToUpper() != "Ç")
            {
                yas = YasHesapla(dogumTarihiGiris);
                Console.WriteLine("Yaşınız: " + yas);
                Console.Write("Doğum tarihinizi giriniz (gün.ay.yıl), çıkmak için \"Ç\" tuşuna basınız: ");
                dogumTarihiGiris = Console.ReadLine();
            }



            // Algoritma Örnek 2: Son Kullanma Tarihi Kontrolü
            /*
            1. başla
            2. kullanıcıdan son kullanma tarihi İngilizce formatta sorulur ve alınır
            3. bir methoda son kullanma tarihi gönderilerek eğer geçtiyse true geçmediyse false dönülür
            4. dönen sonuca göre ekrana son kullanma tarihi geçmiş ya da son kullanma tarihi geçmemiş yazdırılır
            5. bitiş
            */
            Console.Write("Expiration date (month/day/year): ");
            string expirationDate = Console.ReadLine();
            bool result = IsExpired(expirationDate);
            Console.WriteLine(result ? "Expired." : "Not expired.");
        }
        


        #region Algoritma Örnek 1: Yaş Hesaplama
        static int YasHesapla(string dogumTarihiGiris)
        {
            int yas;

            // 1. yöntem:
            //DateTime dogumTarihi = DateTime.Parse(dogumTarihiGiris, new CultureInfo("tr-TR"));
            // 2. yöntem:
            DateTime dogumTarihi = Convert.ToDateTime(dogumTarihiGiris, new CultureInfo("tr-TR"));

            DateTime simdikiTarih = DateTime.Today;
            TimeSpan tarihFarki = simdikiTarih.Subtract(dogumTarihi); // TimeSpan süre için kullanılan veri tipidir. Gün, saat, dakika, saniye ve milisaniyeden oluşan bir struct'tır.
            yas = (int)(tarihFarki.TotalHours / (365 * 24 + 6)); // 1 yıl 365 gün 6 saat olduğu için tarih farkı olan sürenin toplam saatini kullanarak işlem yapıp
                                                                 // ondalık haneden kurtulmak için int'e cast ediyoruz.
                                                                 // Toplam süre için TotalDays, TotalHours, TotalMinutes, TotalSeconds veya TotalMilliseconds özellikleri kullanılmalıdır
            return yas;
        }
        #endregion



        #region Algoritma Örnek 2: Son Kullanma Tarihi Kontrolü
        // eğer istenirse bu method Türkçe formatta bir tarih ile culture parametresi tr-TR gönderilerek de kullanılabilir
        static bool IsExpired(string date, string culture = "en-US")
        {
            bool result = false;
            DateTime today = DateTime.Now.Date;
            DateTime expirationDate = DateTime.Parse(date, new CultureInfo(culture));
            if (expirationDate < today)
                result = true;
            return result;
        }
        #endregion
    }
}