Bir Dizeyi DateTime'a Dönüştürme


590

Nasıl böyle bir dize dönüştürebilirim 2009-05-08 14:40:52,531bir içine DateTime?


2
@dban Bir yanıt neden yanıt olarak @CMSişaretlenmedi? Bir sebep olabilir-merak ediyorum.
nam

5
@nam Kullanıcı hesabını sildi veya yasaklandı, tıklayamaz veya itibar / madalya göremez. Ne yazık ki yapabileceğimiz tek şey ona başparmak vermek.
YumeYume

Yanıtlar:


753

24 saatlik süreyi işlediğiniz ve saniye bölümünü ayıran bir virgül kullandığınız için özel bir biçim belirtmenizi öneririz:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

4
İyi gözler. OP'de virgül görmedim.
Ic.

(Sanırım tarih ve biçim dizelerinde virgül kullanmak istediniz, değil mi?)
lc.

1
Bu, yalnızca Avrupa Birliği Yerel Ayarı ayarı nedeniyle bir virgüldür, ya bu kodu bir US.Locale ile başka bir sunucuya alırsanız, bir bölümün kesirleri kaydedilen dizede virgül değil ondalık olur ve çözümünüz bölünürler. Doğru ayrıştırıcıyı uygulamadan önce, gelen yerel tarih dizesinin türünün doğru Yerel Ayarı için bir denetim eklediğinizden emin olun. Microsoft'un zaten bu kodu CLR veya C # .net'te başka bir yerde önceden oluşturmadığına şaşırdım
hamish

bunu tarih zaman dizesine dönüştüremiyor MyString = "22.06.2019 15:20:14";
Vinod Kumar

Ondalık ayırıcı olarak 24 saatlik zaman ve virgül özel bir yerel ayar değildir. Özel olarak ele alınması gerekmez.
jpaugh

248

Bunun için temel olarak iki seçeneğiniz var. DateTime.Parse()ve DateTime.ParseExact().

Birincisi sözdizimi açısından çok affedicidir ve tarihleri ​​birçok farklı formatta ayrıştırır. Farklı formatlarda olabilecek kullanıcı girişi için iyidir.

ParseExact, ayrıştırma için kullanılacak tarih dizenizin tam biçimini belirtmenize olanak tanır. Dizeniz her zaman aynı biçimdeyse bunu kullanmak iyidir. Bu şekilde, beklenen verilerden sapmaları kolayca tespit edebilirsiniz.

Kullanıcı girişini şu şekilde ayrıştırabilirsiniz:

DateTime enteredDate = DateTime.Parse(enteredString);

Dize için belirli bir biçiminiz varsa, diğer yöntemi kullanmanız gerekir:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"kısa tarih örüntüsü anlamına gelir ( daha fazla bilgi için MSDN'ye bakın ) ve nullgeçerli kültürün dizeyi ayrıştırmak için kullanılması gerektiğini belirtir.


137

bunu dene

DateTime myDate = DateTime.Parse(dateString);

daha iyi bir yol bu olurdu:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}


26

Hiç kimse bir uzatma yöntemi uygulamıyor gibi görünüyor. @ CMS'nin cevabının yardımıyla :

Çalışan ve geliştirilmiş tam kaynak örneği burada: Gist Link

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}

Nobody seems to implemented an extension methodbelki gerekli olmadığı için ...
Yousha Aleayoub

Bazen standart kütüphane ihtiyaçlarımıza uymuyor. Ve bu yüzden yardımcı kütüphanelere ihtiyaç / kullanım. Genişletme yöntemini veya akıcı API'yi kullanmak, OOP yerine FP'yi tercih eder veya tersi de geçerlidir. Ne doğru ne de yanlış. Seçim bu. @YoushaAleayoub
guneysus

23

Çeşitli yollar denedim. Benim için işe yarayan şuydu:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data benim için böyle zamanlar oldu 24.09.2017 09:31:34


Daha iyi görünüyor, değerini DateTime değişkenine atayabilir mi?
Birhan Nega

20

Aşağıdakini deneyin, burada strDate 'MM / gg / yyyy' biçimindeki tarihinizdir

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

1
Kimse sadece bu formatla çalıştığını söylemedi.
T.Todua

Yazık ... 🙂 Kodcular her zaman kodlayıcıların anlayacağını düşünüyorlar ... Aslında iyi bir şey ... Bizi daha fazla düşünün ...
Krishna


15
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);

1
Zaman bölümünü kaçırdınız mı? Hem tarih hem de saate ihtiyacım var, bunu nasıl yapabilirim?
Badhon Jain

15

DateTime.Parse

Sözdizimi:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

Misal:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Değer: tarih ve saatin dize ile temsil edilen hali.
  • Sağlayıcı: kültüre özgü bilgi sağlayan nesne.
  • Stiller: bazı tarih ve saat ayrıştırma yöntemleri için dize ayrıştırmayı özelleştiren biçimlendirme seçenekleri. Örneğin AllowWhiteSpaces, ayrıştırılırken dizede bulunan tüm boşlukları yok saymaya yardımcı olan bir değerdir.

DateTime'ın çerçevede dahili olarak sayı olarak depolanan bir nesne olduğunu da hatırlamakta fayda var, Biçim yalnızca dizeye geri dönüştürdüğünüzde buna uygulanır.

  • Bir dizeyi dahili sayı türüne dönüştürme ayrıştırma.

  • Dahili sayısal değeri okunabilir bir dizeye dönüştüren biçimlendirme.

Son zamanlarda, DateTime bir Linq Sorgusu geçerken biçimini fark etmedi ne zaman Linq için geçmek için bir DateTime dönüştürmek çalışıyordu bir sorun vardı.

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

Tam TarihZaman Belgeleri


14

Ayrıca, giriş değerinden emin değilseniz DateTime.TryParseExact () yöntemini aşağıdaki gibi kullanabilirsiniz.

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}

2

Bu kodu statik bir sınıfa koy> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

Bu şekilde,

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');

2

Sadece zarif bir yol buldum:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"

1

Dünyadaki farklı kültürler tarih dizelerini farklı şekillerde yazarlar. Örneğin, ABD 01/20/2008'de 20 Ocak 2008'dir. Fransa'da bu bir InvalidFormatException oluşturur. Bunun nedeni Fransa'nın tarih saatlerini Gün / Ay / Yıl olarak okuması ve ABD'de Ay / Gün / Yıl olmasıdır.

Sonuç olarak, 20/01/2008 gibi bir dize Fransa'da 20 Ocak 2008'e ayrıştırılır ve ardından ABD'ye bir InvalidFormatException kurar.

Mevcut kültür ayarlarınızı belirlemek için System.Globalization.CultureInfo.CurrentCulture kullanabilirsiniz.

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  

1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

bu sana verir

2019-08-17 11:14:49.000

-1

Hızlı ister misin?

Diyelim ki yyMMdd biçiminde bir tarihiniz var.

Bulduğum dönüştürmenin en hızlı yolu:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')

Sadece, seçtiğiniz tarih biçimine göre dizinleri seçin. Hıza ihtiyacınız varsa, muhtemelen fonksiyonun 'jenerik olmayan' yolunu düşünmezsiniz.

Bu yöntem aşağıdakilerin gerektirdiği sürenin yaklaşık% 10'unu alır:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.