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

Dizeleri nesnelere dönüştürmek için DateTime ayrıştırmak için tarih ve saatlerin metin olarak nasıl temsil edildiklerine ilişkin bilgileri belirtmeniz gerekir. 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 "AM" ve "PM" değerlerini belirtir. Bazı uygulamaların yalnızca tarihe ihtiyacı vardır. Diğerlerinin yalnızca zamana ihtiyacı vardır. Yine de diğer kişilerin hem tarih hem de saati belirtmesi gerekir. Dizeleri nesnelere DateTime dönüştüren yöntemler, beklediğiniz biçimler ve uygulamanızın ihtiyaç duyduğu tarih ve saatin öğeleri hakkında ayrıntılı bilgi sağlamanıza olanak tanır. Metni DateTimedoğru bir şekilde içine dönüştürmek için üç alt görev vardır:

  1. Tarih ve saati temsil eden metnin beklenen biçimini belirtmeniz gerekir.
  2. Tarih saatinin biçimi için kültürü belirtebilirsiniz.
  3. Metin gösterimindeki eksik bileşenlerin tarih ve saatte nasıl ayarlandığını belirtebilirsiniz.

Parse ve TryParse yöntemleri, bir tarih ve saatin birçok ortak temsilini dönüştürür. ParseExact ve TryParseExact yöntemleri, tarih ve saat biçim dizesi tarafından belirtilen desene uyan bir dize gösterimini dönüştürür. Daha fazla bilgi için standart tarih ve saat biçim dizeleri ile özel tarih ve saat biçim dizeleriyle ilgili makalelere bakın.

Geçerli DateTimeFormatInfo nesne, metnin tarih ve saat olarak nasıl yorumlanması gerektiği üzerinde daha fazla denetim sağlar. ' DateTimeFormatInfo nin özellikleri tarih ve saat ayırıcılarını, ayların, günlerin ve dönemlerin adlarını ve "AM" ve "PM" belirtimlerinin biçimini açıklar. tarafından CultureInfoCultureInfo.CurrentCulture döndürülen, geçerli kültürü temsil eden bir CultureInfo.DateTimeFormat özelliğe sahiptir. Belirli bir kültür veya özel ayarlar istiyorsanız, ayrıştırma yönteminin parametresini belirtirsiniz IFormatProvider . parametresi için IFormatProvider bir kültürü veya nesneyi temsil eden bir DateTimeFormatInfo nesne belirtinCultureInfo.

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ği varsayılır. 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. Ayrıştırma yöntemleri bu eksik bilgileri makul varsayılan değerleri kullanarak 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 varsa, saati ve dakikaları veya 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.

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 uzaklık atlanırsa, ayrıştırma özelliği olarak DateTimeKind.Unspecifiedayarlanmış bir DateTime nesne Kind döndürür. Uzaklık belirtilirse ayrıştırma özelliği olarak DateTimeKind.Localayarlanmış bir DateTime nesne Kind 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.

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.

Çözümle

Aşağıdaki örnekte, yönteminin DateTime.Parse bir 'e dönüştürmek string için kullanılması gösterilmektedir DateTime. 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.

İpucu

Bu makaledeki tüm C# örnekleri tarayıcınızda çalıştırılır. Çıkışı görmek için Çalıştır düğmesine basın. Ayrıca bunları düzenleyerek kendi denemelerinizi de yapabilirsiniz.

Not

Bu örnekler hem C#hem de Visual Basic için GitHub belgeleri deposunda bulunur.

string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
'       1/1/2009 00:00:00

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

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
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

Ancak, özel biçim sağlayıcılarını belirtmek için yönteminin Parse aşırı yüklemelerini 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 geçerli tarih ve saat bilgilerinin 'e eklenmemesi gerektiğini belirtmek için numaralandırmayı DateTime kullanırDateTimeStyles.

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
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

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 dizeleriyleilgili 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 nesne eklenir. Bu ParseExact yöntem yalnızca kültürdeki en-US uzun tarih desenini izleyen dizeleri ayrıştırabilir.

var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
    try
    {
        var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
        Console.WriteLine(dateTime);
    }
    catch (FormatException)
    {
        Console.WriteLine("Unable to parse '{0}'", dateString);
    }
}
// The example displays the following output:
//       Unable to parse ' Friday, April 10, 2009'
//       4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
    Try
        Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
                                                     MyCultureInfo)
        Console.WriteLine(MyDateTime)
    Catch e As FormatException
        Console.WriteLine("Unable to parse '{0}'", dateString)
    End Try
Next
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 00:00:00

ve ParseExact yöntemlerinin Parse her aşırı yüklemesi, dizenin biçimlendirmesi hakkında kültüre özgü bilgiler sağlayan bir IFormatProvider parametreye de sahiptir. IFormatProvider nesnesi, standart bir CultureInfo kültürü veya özelliği tarafından CultureInfo.DateTimeFormat döndürülen bir nesneyi temsil eden bir DateTimeFormatInfo 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.

Ayrıca bkz.