30 Ekim 2017 Pazartesi

DateTime Parse Metodları

Giriş
Kısaltmalar şöyle.
yyyy - yıl
MM - ay  (sayı)
dd - gün
T - zaman ayracı
HH - 24 saat üzerinden saat
hh - 12 saat üzerinden saat
mm - dakika
ss - saniye
tt - AM, PM ayracı
+00:00 : saat dilimi

Parse metodlarına başvurmadan önce Convert sınıfını kullanmak daha iyi.
string date = ...
DateTime dt = Convert.ToDateTime(date);
Parse metodu string + culture
Parse metodu girdi olarak belli bir format verilmediği için bir çok formatı deneyerek işlemi gerçekleştirmeye çalışır.  Şeklen şöyle yaparız.
var dt = DateTime.Parse("...", CultureInfo.GetCultureInfo("..."));
Türkçe için şu iki örnek farklı ayraçlar kullanılsa bile başarıyla çevrilir.
DateTime.Parse("06/02/2016", new System.Globalization.CultureInfo("tr-TR"))
veya
DateTime.Parse("06.02.2016", new System.Globalization.CultureInfo("tr-TR"))
Parse metodu - string + format + style
Style sağlamak istersek şöyle yaparız.
string str = ...;
DateTime timeUtc = DateTime.Parse(str, null, DateTimeStyles.AdjustToUniversal);
ParseExact metodu - string + format + culture
İmzası şöyle
DateTime ParseExact(String, String, IFormatProvider)
Şöyle yaparız.
string str = "5/2/2016";
DateTime dt = DateTime.ParseExact(str, "d/M/yyyy", CultureInfo.InvariantCulture);
Şöyle yaparız.
DateTime dt = DateTime.ParseExact("26-12-2017 5:45pm", "dd-MM-yyyy h:mmtt", 
                                  CultureInfo.InvariantCulture);
ParseExact metodu - string + formats (format dizisi) + culture + style
Birden fazla format sağlayabiliriz. Şöyle yaparız.
// ex...
string dateString = ...;  // your date.

string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                   "MM/d/yyyy HH:mm:ss.ffffff" };

var dt = DateTime.ParseExact(dateString, formats, 
  new CultureInfo("en-US"), DateTimeStyles.None);

ParseExact metodu - string + format + culture + style
Normalde ParseExact saat dilimi isimlerini bilmez, ancak saat dilimi farkını (time zone offset) anlar. Dolayısıyla string'in hangi saat diliminde olduğunu biliyorsak, yerel saat dilimine veya UTC'ye çevrilmesini sağlayabiliriz.

Eğer verilen string'in Utc olduğunu biliyorsak ve yerel saate çevrilmesin istiyorsak şöyle yaparız. Açıklaması şöyle
AssumeLocal: Specifies that if s lacks any time zone information, it is assumed to represent a local time. Unless the DateTimeStyles.AdjustToUniversal flag is present, the Kind property of the returned DateTime value is set to DateTimeKind.Local.
AssumeUniversal: Specifies that if s lacks any time zone information, it is assumed to represent UTC. Unless the DateTimeStyles.AdjustToUniversal flag is present, the method converts the returned DateTime value from UTC to local time and sets its Kind property to DateTimeKind.Local.
AssumeUniversal string'in Utc olduğunu belirtir. AdjustToUniversal yerel saate çevrilmemesini belirtir.
DateTime.ParseExact(dateString, 
               "MM/dd/yyyy HH:mm:ss", 
               CultureInfo.InvariantCulture, 
               DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)
TryParse metodu - string
Örnek
Şöyle yaparız.
DateTime dob;
DateTime.TryParse("...", out dob);
Örnek
Şöyle yaparız.
string s = "5:45 PM";
DateTime d;
DateTime.TryParse(s, out d);
Eğer parse işlemi hatalıysa bile değişkenimize bir değer atanır, çünkü result parametresi out olarak tanımlı.
bool TryParse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles, 
              out DateTime result) {
  result = DateTime.MinValue;
  ...
    
}
TryParseExact metodu - string + format  + culture + style
Örnek
Şöyle yaparız.
string dateTime =   "...";
string dateFormat = "...";

DateTime timeResult;
bool parsed = DateTime.TryParseExact(dateTime, dateFormat,
 CultureInfo.InvariantCulture, 
 DateTimeStyles.AssumeLocal, out timeResult);
TryParseExact metodu - string + formats (format dizisi) + culture + style
Örnek
Birden fazla format sağlayabiliriz. Şöyle yaparız.
string[] formats = { "yyyyMMdd HH:mm:ss", "ddMMyyyy HH:mm:ss",
                    "yyyy/MM/dd HH:mm:ss", "MM/dd/yyyy HH:mm:ss" }; //and so on
string dtText = "01/31/2016 23:30:15"; //example
DateTime dt;
bool parsed = DateTime.TryParseExact(dtText, formats, 
  CultureInfo.InvariantCulture, 
  DateTimeStyles.AssumeLocal, out dt);

Hiç yorum yok:

Yorum Gönder