27 Şubat 2018 Salı

TimeSpan Yapısı

Bu sınıf Java 8 'deki Duration kavramına benziyor. Yaz saatinden, artık yıldan, sistem saatinden bağımsızdır çünkü bu sınıf içinde tick denilen bir alan barındırır. Süre hakkında bildiği tek şey budur. Tick kavramının ne olduğu aşağıda FromTicks metoduna açıklanıyor.

Total ile başlayan alanların açıklaması şöyle
With TimeSpan you always have to use the Total properties if you want to know the total time that has passed. All properties without Total in front of them only display the current amount of time that has passed.
Constructor - hours + minutes + seconds
Şöyle yaparız.
new TimeSpan(7, 23, 0);
Constructor - days + hours + minutes + seconds
Örnek ver.

Constructor - days + hours + minutes + seconds + milliseconds
Şöyle yaparız
TimeSpan span = new TimeSpan (0, 0, 13, 0, 0);
Constructor - Date Arithmetic
İki tarih arasındaki süre ile de kurulabilir.
var startDateTime = DateTime.Parse(starttime).Time;
var endDateTime = DateTime.Parse(endtime).Time;
TimeSpan timeSpent = endDateTime - startDateTime;
Days Alanı
Şöyle yaparız.
Console.WriteLine(ts.Days.ToString());
Duration metodu
Bu alan ismen aslında tam bir kavram kargaşası yaratıyor. Mutlak değere sahip bir TimeSpan döndürür. Yani tick alanımız eksi ise bunu mutlak değer haline getirip yeni bir TimeSpan verir.
FromDays metodu
Şöyle yaparız.
TimeSpan ts = TimeSpan.FromDays (1);
FromHours metodu
Şöyle yaparız.
TimeSpan ts = TimeSpan.FromHours(5.4898391027272906);
Console.WriteLine (ts.Seconds); // 23
FromMicroSeconds metodu
Böyle bir metod yok ve niçin yok bilmiyorum ancak yazmak isteseydik şöyle yapardık. Tick sayısını 10 ile çarpınca mikrosaniye elde ederiz.
var ts = TimeSpan.FromTicks(long.Parse(Console.ReadLine())*10);
FromMinutes metodu
Örnek
Şöyle yaparız. Çıktı olarak 33:20 alırız.
double minutes = 2000;
TimeSpan ts = TimeSpan.FromMinutes(minutes);
var res = $"{(int)ts.TotalHours}:{ts.Minutes}";
Örnek
Double sayı verilebilir. Şöyle yaparız.
TimeSpan a = TimeSpan.FromMinutes(2);
TimeSpan b = TimeSpan.FromMinutes(1.95);
TimeSpan c = TimeSpan.FromMinutes(1.97);
TimeSpan d = TimeSpan.FromMinutes(1.99);
FromSeconds metodu
Şöyle yaparız.
TimeSpan ts = TimeSpan.FromSeconds (0);
FromTicks metodu
TimeSpan sınıfı 100 nanosaniyeye denk gelen tick kavramını kullanıyor. Tick kavramı tam olarak nereden geliyor bilmiyorum ancak işlemci hızından ve işletim sisteminden bağımsız. TimeSpan.TicksPerSecond alanı ile bu değer alınabilir. Değer 10 milyon'dur çünkü 1 saniye 1 milyar nanosaniye var.
1 tick = 100 nanoseconds
       = 0.1 microseconds
       = 0.0001 milliseconds
       = 0.0000001 seconds
Tick sayısı ile TimeSpan nesnesi yaratılabilir.
TimeSpan ts = TimeSpan.FromTicks(28000000000);
Hours Alanı
Şöyle yaparız.
Console.WriteLine(ts.Hours.ToString());
Minutes Alanı
0 - 59 arasında bir değer verir. Şöyle yaparız.
Console.WriteLine(ts.Minutes.ToString());
Parse metodu
Hours:Minutes:Seconds:Miliseconds için şöyle yaparız.
TimeSpan ts = TimeSpan.Parse("10:00:00")
Days:Hours:Minutes:Seconds:Miliseconds için şöyle yaparız.
TimeSpan ts = TimeSpan.Parse ("2:04:13:27.0000000");
ParseExact metodu
Şöyle yaparız.
TimeSpan ts = TimeSpan.ParseExact("11.35", "mm'.'ss", null);
Seconds Alanı
0 - 59 arasında bir değer verir. Şöyle yaparız.


TimeSpan span = TimeSpan.FromHours (5.4898391027272906);
Console.WriteLine(span.Seconds); // 23
Ticks Alanı
Bu alan 64 bit uzunluğunda. Direkt kullanmak pek gerekmiyor. Şöyle yaparız.
TimeSpan ts = new TimeSpan( 2, 8, 8, 8 );
Int64 bits = ts.Ticks;
TotalDays Alanı
tick alanı belli bir sabite bölünerek gün sayısına çevrilir.
public double TotalDays {
    get { return ((double)_ticks) * DaysPerTick; }
}
TotalMiliSeconds Alanı
double türündendir. Şöyle yaparız.
double interval = TimeSpan.FromDays(1).TotalMilliseconds;//24 * 60 * 60 * 1000
TotalSeconds Alanı
double türündendir. Şöyle yaparız.
string longTime = "23:33:44";
TimeSpan ts = TimeSpan.Parse(longTime, CultureInfo.InvariantCulture);
double seconds = ts.TotalSeconds; // 84824
ToString metodu
.Net 4.0 ile TimeSpan IFormattable arayüzünden kalıtıyor. Şöyle yaparız.
ts.ToString(@"hh\:mm\:ss\.ff")
Zero Alanı
Şöyle yaparız.
TimeSpan.Zero;
Diğer
Infinite TimeSpan
Fikren saçma gelse de Timeout işlemleri için böyle bir nesne tanımlamak mümkün. Day, Hour, Minute, Second olarak 0, Millisecond olarak -1 verilince infinite kabul ediliyor. Yani şöyle yaratabiliriz.
TimeSpan infinite = TimeSpan.FromMilliseconds (-1);
Ayrıca Timeout.InfiniteTimeSpan alanı da aynı işlevi görür. Zaten bu alan şöyle tanımlı.
TimeSpan InfiniteTimeSpan = new TimeSpan (0, 0, 0, 0, Timeout.Infinite);
public const int Infinite = -1;

Hiç yorum yok:

Yorum Gönder