Aracılığıyla paylaş


.NET'te tarih ve saat dizelerini ayrıştırma

.NET, tarih ve saat verileriyle çalışmak için her biri farklı senaryolar için iyileştirilmiş çeşitli türler sağlar:

  • DateTime - Her iki bileşene de ihtiyacınız olduğunda veya eski kodla çalışırken ideal olan bir tarih ve saati birlikte temsil eder.
  • DateOnly (.NET Framework'te kullanılamaz) - Yalnızca saat bilgisi olmayan bir tarihi temsil eder; doğum günleri, yıldönümleri veya iş tarihleri için mükemmeldir.
  • TimeOnly (.NET Framework'te kullanılamaz) - Yalnızca tarih bilgisi olmayan bir saati temsil eder; zamanlamalar, alarmlar veya yinelenen günlük olaylar için idealdir.

Her tür, ayrıştırma işlemi üzerinde farklı esneklik ve denetim düzeyleriyle dizeleri ilgili nesnelerine dönüştüren ayrıştırma yöntemleri sağlar.

Yaygın ayrıştırma kavramları

Üç tarih ve saat türünün de benzer ayrıştırma yaklaşımları vardır:

  • Parse ve TryParse yöntemleri - Geçerli kültür veya belirtilen kültür ayarlarını kullanarak birçok ortak dize gösterimini dönüştürün.
  • ParseExact ve TryParseExact yöntemleri - Belirli biçim desenlerine uyan dizeleri dönüştürerek kültür ayarları da dahil olmak üzere beklenen biçimler üzerinde kesin denetim sağlar.
  • Biçim dizeleri - Standart veya özel biçim tanımlayıcılarını kullanarak ayrıştırma desenleri tanımlayın.

Farklı kültürler gün, ay ve yıl için farklı siparişler kullanır. Bazı zaman gösterimlerinde 24 saatlik bir saat kullanılırken, diğerleri "" ve "PM" değerlerini belirtir. Ayrıştırma yöntemleri bu çeşitlemeleri kültüre özgü biçimlendirme kuralları aracılığıyla işler.

nesnesi, DateTimeFormatInfo metnin nasıl yorumlanması gerektiği üzerinde denetim sağlar. Özellikler tarih ve saat ayırıcılarını, ayların, günlerin, dönemlerin adlarını ve "" ve "PM" belirtimlerinin biçimini açıklar. IFormatProvider parametresi aracılığıyla bir CultureInfo nesnesi veya bir DateTimeFormatInfo nesnesi kullanarak kültürü belirtebilirsiniz.

Biçim desenleri hakkında daha fazla bilgi için bkz. standart tarih ve saat biçimi dizelerive özel tarih ve saat biçimi dizeleri.

Önemli

DateOnly ve TimeOnly türleri .NET Framework için kullanılamaz.

DateTime ayrıştırma

DateTime hem tarih hem de saat bileşenlerini birlikte temsil eder. Dizeleri nesnelere DateTime ayrıştırırken, birkaç DateTimeözel yönü göz önünde bulundurmanız gerekir:

  • Eksik bilgi işleme - DateTime giriş dizesinde parçalar eksik olduğunda varsayılan değerleri kullanır.
  • Saat dilimi ve UTC uzaklık desteği - DateTime yerel, UTC veya belirtilmeyen saat dilimlerini temsil edebilir.
  • Birleştirilmiş tarih ve saat ayrıştırma - Tek bir işlemde hem tarih hem de saat bileşenlerinin işlenmesi gerekir.

Eksik bilgi işleme

Tarih veya saati temsil eden metinde bazı bilgiler eksik olabilir. Örneğin, çoğu kişi "12 Mart" tarihinin geçerli yılı temsil ettiğini varsayar. Benzer şekilde, "Mart 2018", 2018 yılının Mart ayıdır. Saati temsil eden metin genellikle yalnızca saatleri, dakikaları ve AM/PM gösterimini içerir. DateTime ayrıştırma yöntemleri, makul varsayılan değerleri kullanarak bu eksik bilgileri işler:

  • Yalnızca saat mevcut olduğunda, tarih bölümü geçerli tarihi kullanır.
  • Yalnızca tarih mevcut olduğunda, saat bölümü gece yarısı olur.
  • Yıl bir tarihte belirtilmediğinde geçerli yıl kullanılır.
  • Ayın günü belirtilmediğinde, ayın ilk günü kullanılır.

Dizede tarih varsa, ay ve günün veya yılın birini içermelidir. Zaman mevcutsa, saati ve ya dakikaları ya da AM/PM belirleyicisini içermelidir.

Bu varsayılanları geçersiz kılmak için sabiti belirtebilirsiniz NoCurrentDateDefault . Bu sabiti kullandığınızda, eksik yıl, ay veya gün özellikleri değerine 1ayarlanır. kullanılan son örnekteParse bu davranış gösterilmektedir.

UTC ofseti ve saat dilimi yönetimi

Tarih ve saat bileşenine ek olarak, tarih ve saatin dize gösterimi, saatin Eşgüdümlü Evrensel Saat'ten (UTC) ne kadar farklı olduğunu gösteren bir uzaklık içerebilir. Örneğin, "14/2/2007 5:32:00 -7:00" dizesi UTC'den yedi saat önceki bir saati tanımlar. Bir zamanın dize gösteriminden zaman dilimi atlanırsa, ayrıştırma işlemi DateTime öğesini, Kind özelliği olarak DateTimeKind.Unspecified ayarlanmış şekilde döndürür. Belirtilen bir uzaklık varsa, ayrıştırma DateTime özelliği Kind olarak ayarlanmış bir DateTimeKind.Local nesnesi döndürür. Değeri, makinenizin yerel saat dilimine de ayarlanır. Ayrıştırma yöntemiyle bir DateTimeStyles değer kullanarak bu davranışı değiştirebilirsiniz.

Belirsiz tarih işleme

Biçim sağlayıcısı, belirsiz bir sayısal tarihi yorumlamak için de kullanılır. "02/03/04" dizesiyle temsil edilen tarihin hangi bileşenlerinin ay, gün ve yıl olduğu belirsizdir. Bileşenler, biçim sağlayıcısındaki benzer tarih biçimlerinin sırasına göre yorumlanır.

TarihSaat.Parse

Aşağıdaki örnekte, DateTime.Parse yönteminin, string öğesini bir DateTime'e dönüştürmek için nasıl kullanıldığı gösterilmektedir. Bu örnek, geçerli iş parçacığıyla ilişkili kültürü kullanır. CultureInfo Geçerli kültürle ilişkili giriş dizesini ayrıştıramıyorsa, bir FormatException oluşturulur.

static void DateTimeParseExample()
{
    // Parse common date and time formats using current culture
    var dateTime1 = DateTime.Parse("1/15/2025 3:30 PM");
    var dateTime2 = DateTime.Parse("January 15, 2025");
    var dateTime3 = DateTime.Parse("15:30:45");

    Console.WriteLine($"Parsed: {dateTime1}");
    Console.WriteLine($"Parsed: {dateTime2}");
    Console.WriteLine($"Parsed: {dateTime3}");

    // Parse with specific culture
    var germanDate = DateTime.Parse("15.01.2025", new CultureInfo("de-DE"));
    Console.WriteLine($"German date parsed: {germanDate}");
}
Sub DateTimeParseExample()
    ' Parse common date and time formats using current culture
    Dim dateTime1 = DateTime.Parse("1/15/2025 3:30 PM")
    Dim dateTime2 = DateTime.Parse("January 15, 2025")
    Dim dateTime3 = DateTime.Parse("15:30:45")

    Console.WriteLine($"Parsed: {dateTime1}")
    Console.WriteLine($"Parsed: {dateTime2}")
    Console.WriteLine($"Parsed: {dateTime3}")

    ' Parse with specific culture
    Dim germanDate = DateTime.Parse("15.01.2025", New CultureInfo("de-DE"))
    Console.WriteLine($"German date parsed: {germanDate}")
End Sub

Ayrıca, bir dizeyi ayrıştırdığınızda biçimlendirme kuralları kullanılan kültürü açıkça tanımlayabilirsiniz. Özellik tarafından döndürülen standart DateTimeFormatInfo nesnelerden birini CultureInfo.DateTimeFormat olarak belirtirsiniz. Aşağıdaki örnek, bir Almanca dizesini içine ayrıştırmak için bir DateTimebiçim sağlayıcısı kullanır. CultureInfo, de-DE kültürünü temsil eder. Bu CultureInfo nesne, bu dizenin başarıyla ayrıştırılmasını sağlar. Bu işlem, CurrentCulture içindeki CurrentThread ayarların ne olursa olsun geçersiz kılar.

static void DateTimeParseGermanExample()
{
    var cultureInfo = new CultureInfo("de-DE");
    string dateString = "12 Juni 2008";
    var dateTime = DateTime.Parse(dateString, cultureInfo);
    Console.WriteLine(dateTime);
    // The example displays the following output:
    //       6/12/2008 00:00:00
}
Sub DateTimeParseGermanExample()
    Dim MyCultureInfo As New CultureInfo("de-DE")
    Dim MyString As String = "12 Juni 2008"
    Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
    Console.WriteLine(MyDateTime)
    ' The example displays the following output:
    '       6/12/2008 00:00:00
End Sub

Ancak Parse yönteminin aşırı yüklemelerini, özel biçim sağlayıcılarını belirtmek için kullanabilirsiniz. yöntemi standart Parse olmayan biçimleri ayrıştırma işlemini desteklemez. Standart olmayan biçimde ifade edilen bir tarih ve saati ayrıştırmak için bunun yerine yöntemini kullanın ParseExact .

Aşağıdaki örnek, belirtilmeyen alanlar için mevcut tarih ve saat bilgilerinin DateTimeStyles'e eklenmemesi gerektiğini belirtmek üzere DateTime numaralandırmasını kullanır.

static void DateTimeParseNoDefaultExample()
{
    var cultureInfo = new CultureInfo("de-DE");
    string dateString = "12 Juni 2008";
    var dateTime = DateTime.Parse(dateString, cultureInfo,
                                    DateTimeStyles.NoCurrentDateDefault);
    Console.WriteLine(dateTime);
    // The example displays the following output if the current culture is en-US:
    //      6/12/2008 00:00:00
}
Sub DateTimeParseNoDefaultExample()
    Dim MyCultureInfo As New CultureInfo("de-DE")
    Dim MyString As String = "12 Juni 2008"
    Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
                               DateTimeStyles.NoCurrentDateDefault)
    Console.WriteLine(MyDateTime)
    ' The example displays the following output if the current culture is en-US:
    '       6/12/2008 00:00:00
End Sub

DateTime.ParseExact

yöntemi, DateTime.ParseExact belirtilen dize desenlerinden birine uygunsa bir dizeyi nesneye DateTime dönüştürür. Belirtilen formlardan biri olmayan bir dize bu yönteme geçirildiğinde, bir FormatException oluşturulur. Standart tarih ve saat biçimi tanımlayıcılarından birini veya özel biçim tanımlayıcılarının bir bileşimini belirtebilirsiniz. Özel biçim tanımlayıcılarını kullanarak özel bir tanıma dizesi oluşturmanız mümkündür. Tanımlayıcıların açıklaması için standart tarih ve saat biçimi dizeleri ile özel tarih ve saat biçim dizeleriyle ilgili makalelere bakın.

Aşağıdaki örnekte, DateTime.ParseExact yöntemi ayrıştırmak için bir dize nesnesi geçirilir, ardından bir biçim tanımlayıcısı ve ardından bir CultureInfo nesnesi geçirilir. Bu ParseExact yöntem yalnızca kültürdeki en-US uzun tarih desenini izleyen dizeleri ayrıştırabilir.

static void DateTimeParseExactExample()
{
    // Parse exact format
    var exactDate = DateTime.ParseExact("2025-01-15T14:30:00", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact parse: {exactDate}");

    // Parse with custom format
    var customDate = DateTime.ParseExact("15/Jan/2025 2:30 PM", "dd/MMM/yyyy h:mm tt", CultureInfo.InvariantCulture);
    Console.WriteLine($"Custom format: {customDate}");
}
Sub DateTimeParseExactExample()
    ' Parse exact format
    Dim exactDate = DateTime.ParseExact("2025-01-15T14:30:00", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact parse: {exactDate}")

    ' Parse with custom format
    Dim customDate = DateTime.ParseExact("15/Jan/2025 2:30 PM", "dd/MMM/yyyy h:mm tt", CultureInfo.InvariantCulture)
    Console.WriteLine($"Custom format: {customDate}")
End Sub

Her Parse ve ParseExact yönteminin her bir aşırı yüklemesi, dizenin biçimlendirilmesiyle ilgili kültüre özgü bilgiler sağlayan bir IFormatProvider parametreye de sahiptir. IFormatProvider nesnesi, standart bir CultureInfo kültürünü veya CultureInfo.DateTimeFormat özelliği tarafından döndürülen bir DateTimeFormatInfo nesnesini temsil eden bir nesnedir. ParseExact ayrıca bir veya daha fazla özel tarih ve saat biçimi tanımlayan ek bir dize veya dize dizisi bağımsız değişkeni kullanır.

DateOnly ayrıştırma işlemi

Yapı DateOnly yalnızca saat bilgisi olmayan bir tarihi temsil eder ve doğum günleri, yıldönümleri veya iş tarihleri gibi senaryolar için mükemmel hale getirir. Saat bileşeni olmadığından, günün başından sonuna kadar olan bir tarihi temsil eder.

DateOnly, yalnızca tarih senaryoları için DateTime kullanmaya göre çeşitli avantajlara sahiptir.

  • DateTime yapısı bir saat dilimi tarafından kaydırıldığında, bir önceki veya sonraki güne yuvarlanabilir. DateOnly saat dilimine göre kaydırılamaz ve her zaman ayarlanan tarihi temsil eder.
  • Serileştirme DateOnly, DateTime ile karşılaştırıldığında daha az veri içerir.
  • Kod SQL Server gibi bir veritabanıyla etkileşime geçtiğinde, tüm tarihler genellikle saat içermeyen veri türü olarak date depolanır. DateOnly veritabanı türüyle daha iyi eşleşir.

DateOnly.Parse

yöntemi, DateOnly.Parse ortak tarih dizesi gösterimlerini bir DateOnly nesneye dönüştürür. yöntemi çeşitli biçimleri kabul eder ve ayrıştırma için geçerli kültürü veya belirtilen bir kültürü kullanır.

static void DateOnlyParseExample()
{
    // Parse common date formats
    var date1 = DateOnly.Parse("1/15/2025");
    var date2 = DateOnly.Parse("January 15, 2025", CultureInfo.InvariantCulture);
    var date3 = DateOnly.Parse("2025-01-15");

    Console.WriteLine($"Parsed date: {date1}");
    Console.WriteLine($"Parsed date: {date2.ToString("D")}"); // Long date format
    Console.WriteLine($"Parsed date: {date3.ToString("yyyy-MM-dd")}");

    // Parse with specific culture
    var germanDate = DateOnly.Parse("15.01.2025", new CultureInfo("de-DE"));
    Console.WriteLine($"German date: {germanDate}");
}
Sub DateOnlyParseExample()
    ' Parse common date formats
    Dim date1 = DateOnly.Parse("1/15/2025")
    Dim date2 = DateOnly.Parse("January 15, 2025", CultureInfo.InvariantCulture)
    Dim date3 = DateOnly.Parse("2025-01-15")

    Console.WriteLine($"Parsed date: {date1}")
    Console.WriteLine($"Parsed date: {date2.ToString("D")}") ' Long date format
    Console.WriteLine($"Parsed date: {date3.ToString("yyyy-MM-dd")}")

    ' Parse with specific culture
    Dim germanDate = DateOnly.Parse("15.01.2025", New CultureInfo("de-DE"))
    Console.WriteLine($"German date: {germanDate}")
End Sub

DateOnly.ParseExact

yöntemi, DateOnly.ParseExact giriş dizesinin beklenen biçimi üzerinde kesin denetim sağlar. Tarih dizesinin tam biçimini bildiğinizde ve katı ayrıştırma sağlamak istediğinizde bu yöntemi kullanın.

static void DateOnlyParseExactExample()
{
    // Parse exact format
    var exactDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact date: {exactDate}");

    // Parse ISO format
    var isoDate = DateOnly.ParseExact("2025-01-15", "yyyy-MM-dd", CultureInfo.InvariantCulture);
    Console.WriteLine($"ISO date: {isoDate}");

    // Parse with multiple possible formats
    string[] formats = { "MM/dd/yyyy", "M/d/yyyy", "dd/MM/yyyy" };
    var flexibleDate = DateOnly.ParseExact("1/15/2025", formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    Console.WriteLine($"Flexible parse: {flexibleDate}");
}
Sub DateOnlyParseExactExample()
    ' Parse exact format
    Dim exactDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact date: {exactDate}")

    ' Parse ISO format
    Dim isoDate = DateOnly.ParseExact("2025-01-15", "yyyy-MM-dd", CultureInfo.InvariantCulture)
    Console.WriteLine($"ISO date: {isoDate}")

    ' Parse with multiple possible formats
    Dim formats() As String = {"MM/dd/yyyy", "M/d/yyyy", "dd/MM/yyyy"}
    Dim flexibleDate = DateOnly.ParseExact("1/15/2025", formats, CultureInfo.InvariantCulture, DateTimeStyles.None)
    Console.WriteLine($"Flexible parse: {flexibleDate}")
End Sub

yöntemi tek ParseExact bir biçim dizesini veya bir dizi biçim dizesini kabul eder ve birden çok kabul edilebilir biçimde gelebilecek tarihleri ayrıştırmanıza olanak sağlar.

TimeOnly ayrıştırma

TimeOnly yapısı, günlük çalar saat veya her gün hangi saatte öğle yemeği yediğiniz gibi bir günü içindeki belirli bir saati temsil eder. TimeOnly , günün belirli bir saati olan 00:00:00.00000000 - 23:59:59.99999999 aralığıyla sınırlıdır.

TimeOnly yalnızca zaman senaryoları için diğer türler kullanılırken var olan çeşitli sorunları çözer:

  • TimeSpan geçen süreyi temsil eder ve negatif olabilir veya 24 saati aşabilir, bu da günün belirli bir saatini temsil etmek için uygun olmaz.
  • Günün belirli bir saatinde kullanmak DateTime rastgele bir tarih gerektirir ve bu da hesaplamalar yapılırken beklenmeyen davranışlara yol açabilir.
  • TimeOnly zaman değerleri eklerken veya çıkarırken 24 saatlik dönme işlevini doğal olarak işler.

TimeOnly.Parse

yöntemi, TimeOnly.Parse ortak zaman dizesi gösterimlerini bir TimeOnly nesneye dönüştürür. Yöntem, hem 12 saatlik hem de 24 saatlik format da dahil olmak üzere çeşitli biçimleri kabul eder.

static void TimeOnlyParseExample()
{
    // Parse common time formats
    var time1 = TimeOnly.Parse("14:30:15");
    var time2 = TimeOnly.Parse("2:30 PM", CultureInfo.InvariantCulture);
    var time3 = TimeOnly.Parse("17:45");

    Console.WriteLine($"Parsed time: {time1}");
    Console.WriteLine($"Parsed time: {time2.ToString("t")}"); // Short time format
    Console.WriteLine($"Parsed time: {time3.ToString("HH:mm")}");

    // Parse with milliseconds
    var preciseTime = TimeOnly.Parse("14:30:15.123");
    Console.WriteLine($"Precise time: {preciseTime.ToString("HH:mm:ss.fff")}");
}
Sub TimeOnlyParseExample()
    ' Parse common time formats
    Dim time1 = TimeOnly.Parse("14:30:15")
    Dim time2 = TimeOnly.Parse("2:30 PM", CultureInfo.InvariantCulture)
    Dim time3 = TimeOnly.Parse("17:45")

    Console.WriteLine($"Parsed time: {time1}")
    Console.WriteLine($"Parsed time: {time2.ToString("t")}") ' Short time format
    Console.WriteLine($"Parsed time: {time3.ToString("HH:mm")}")

    ' Parse with milliseconds
    Dim preciseTime = TimeOnly.Parse("14:30:15.123")
    Console.WriteLine($"Precise time: {preciseTime.ToString("HH:mm:ss.fff")}")
End Sub

TimeOnly.ParseExact

yöntemi, TimeOnly.ParseExact giriş zamanı dizesinin beklenen biçimi üzerinde kesin denetim sağlar. Tam biçimi bildiğinizde ve katı ayrıştırma sağlamak istediğinizde bu yöntemi kullanın.

static void TimeOnlyParseExactExample()
{
    // Parse exact format
    var exactTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact time: {exactTime}");

    // Parse 24-hour format
    var militaryTime = TimeOnly.ParseExact("17:30:25", "HH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"Military time: {militaryTime}");

    // Parse with multiple possible formats
    string[] timeFormats = { "h:mm tt", "HH:mm", "H:mm" };
    var flexibleTime = TimeOnly.ParseExact("2:30 PM", timeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    Console.WriteLine($"Flexible time parse: {flexibleTime}");
}
Sub TimeOnlyParseExactExample()
    ' Parse exact format
    Dim exactTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact time: {exactTime}")

    ' Parse 24-hour format
    Dim militaryTime = TimeOnly.ParseExact("17:30:25", "HH:mm:ss", CultureInfo.InvariantCulture)
    Console.WriteLine($"Military time: {militaryTime}")

    ' Parse with multiple possible formats
    Dim timeFormats() As String = {"h:mm tt", "HH:mm", "H:mm"}
    Dim flexibleTime = TimeOnly.ParseExact("2:30 PM", timeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None)
    Console.WriteLine($"Flexible time parse: {flexibleTime}")
End Sub

Ayrıca bakınız