Dize geçerli bir DateTime “biçim dd / AA / yyyy” olarak tanınmadı


172

Benim dize biçimlendirilmiş değeri biçimiyle tarih türüne dönüştürmek çalışıyorum dd/MM/yyyy.

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

Sorun nedir ? İsteyen ikinci bir geçersiz kılma var IFormatProvider. Bu nedir? Bunu da geçmem gerekiyor mu? Evet ise, bu dava için nasıl kullanılır?

Düzenle

Arasındaki farklar nelerdir Parseve ParseExact?

Düzenle 2

Slaks ve Sam'in her iki yanıtı benim için çalışıyor, şu anda kullanıcı girişi veriyor, ancak maskTextbox kullanarak geçerli olduklarından emin olacağım.

Hangi cevap türü güvenlik, performans veya sizin gibi hissettiğiniz bir şey göz önüne alındığında daha iyidir


7
@Edit: Dokümantasyon bunun için. msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks

2
ParseExact, tarih dizesinin tam biçimini bildiğiniz zaman içindir, Parse, biraz daha dinamik bir şeyi işleyebilecek bir şey istediğiniz zamandır.
gingerbreadboy

Yanıtlar:


255

Kullanın DateTime.ParseExact.

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);

8
Neden burada boş kalmalıyız?
Shantanu Gupta

3
Giriş "22/11/2009 00:00:00" veya "22/11/2009" olabilir. Ayrıca geliştirme makinesinin kültürü üretim kültüründen farklı olabilir. Yukarıdaki kod sorunsuz bir şekilde çalışacak mı?
Rahatur

8
@Rahat, biçim eşleşmezse kesin çözümleme çalışmaz. Yukarıdaki biçim örüntüsü olduğundan, dd/MM/yyyyiçinde zaman bulunan bir metin dizesi düzgün ayrıştırılmaz. Zamanı çıkarmanız veya format desenine eklemeniz gerekir. ParseExactBir dizi biçim örüntüsünü kabul eden ve metni bunlardan herhangi biriyle eşleşirse ayrıştıran aşırı yükleme var .
Samuel Neff

7
@SamuelNeff CultureInfo.InvariantCultureYine de bir biçim tanımlıyorsanız neden geçerli olanın yerine kullanmıyorsunuz ?
Alvin Wong

3
@Toolkit Bunun nedeni, biçim dizesindeki eğik çizgilerin değişmez eğik çizgi olmamasıdır. Bunlar, mevcut kültürdeki tarih ayırıcı dizeyle değiştirilir. Dolayısıyla kültür, yukarıda yazıldığı gibi bağlıdır. Samuel Neff, deneyin Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, çözümünüzü kıracak. Bunu düzeltmek için "dd'/'MM'/'yyyy"(eğik çizgileri tek tırnak işareti ile koruma) veya @"dd\/MM\/yyyy"(eğik çizgileri ters eğik çizgilerle "kaçma") kullanın.
Jeppe Stig Nielsen

44

ParseExactSağladığınız biçimle tam olarak eşleşen bir tarihi ayrıştıran çağrı yapmanız gerekir .

Örneğin:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

IFormatProviderParametre tarihini ayrıştırmak için kullanmak kültürünü belirler.
Dizeniz kullanıcıdan gelmedikçe, geçmeniz gerekir CultureInfo.InvariantCulture.
Dize kullanıcıdan geliyorsa, kullanıcının CultureInfo.CurrentCultureDenetim Masası'ndaki Bölgesel Seçenekler'de belirttiği ayarları kullanması gerekir .


2
@Slaks: CultureInfo.InvariantCulture kodda mevcut değil. Bazı isim alanını kullanmam gerekiyor mu
Shantanu Gupta

3
using System.Globalization;
SLaks

2
Ayrıca hatayı sağ tıklayabilir ve çözmek sizin için eksik ad alanına koyacağınız çözmek tıklayın.
Anahtar

ayrıca hatayı çift tıklayabilir ve kullanabileceğiniz ilgili ad alanlarını gösteren bir ok görebilirsiniz
Usman Younas

Boşluklar da sayılır, örneğin dize biçiminiz "AA / gg / yyyy SS: dd: ss" (not - 2 boşluk) ise - ParseExact biçiminiz de boşlukları içermelidir
Chris Halcrow

20

Bir DateTime öğesinin dize olarak temsilini ayrıştırmak zor bir şeydir çünkü farklı kültürlerin farklı tarih biçimleri vardır. .Net, bu tarih biçimlerinin farkındadır ve System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormataradığınızda bunları geçerli kültürünüzden ( ) çeker DateTime.Parse(this.Text);

Örneğin, "22/11/2009" dizesi Amerika Birleşik Devletleri (en-US) için ShortDatePattern ile eşleşmez, ancak Fransa (fr-FR) ile eşleşir.

Şimdi, DateTime.ParseExactbeklediğiniz tam biçim dizesini arayabilir ve iletebilir veya DateTime.Parsetarihi ayrıştırmak için uygun bir kültürü iletebilirsiniz .

Örneğin, bu tarihinizi doğru şekilde ayrıştırır:

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

Tabii ki, sadece rastgele rastgele değil, ihtiyaçlarınıza uygun bir şey seçmelisiniz.

Çözmeniz gereken şey neye System.Threading.Thread.CurrentThread.CurrentCultureayarlandığı ve beklediğinizden farklı olup olmadığı / nedenidir.


çözümünüz benim için çalışmıyor "String geçerli bir DateTime olarak tanınmadı" gibi bir hata veriyor. ve ben aşağıdaki giriş tarihini geçiyorum: "13/06/17" çözümüne ama hata veriyor.Plz bana yardım et.
Ghanshyam Lakhani

16

Yukarıdaki çözümler etkili olmasına rağmen, webconfig dosyasını aşağıdakilerle de değiştirebilirsiniz ...

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

Ref: yerel makinede tarih formatı üretim makinesine göre farklı


1
Amit Philips, günümü kurtardın .. Tüm olası şeyleri denemiştim. Ve bu küçük değişiklik işe yarıyor. Teşekkürler.
RNH

1
Amit, sen gerçekten Tanrı'nın oğlusun.
Öfkeli Ayı


4

Çok zaman geçirdikten sonra sorunu çözdüm

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);

3

dizeyi datetime'a dönüştürmek için bunu kullanın:

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)

3

Bu referansa dayanarak , bir sonraki yaklaşım benim için çalıştı:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);

2
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}

1

Tıpkı yukarıdaki birisinin dize parametresi olarak gönderebileceğini söylediği gibi, ancak şu biçimde olması gerekir: örneğin '20130121' ve doğrudan kontrolden alarak bu formata dönüştürebilirsiniz. Böylece, örneğin aşağıdaki gibi bir metin kutusundan alırsınız:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

dönüştürmek için: '20130121' kullanın:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

böylece SQL onu dönüştürüp veritabanınıza koyabilir.


0

Ayrıca kullanabilirsiniz

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day

0

Kodun altında benim için çalıştı:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

Ad alanı

using System.Globalization;

-6

Manuel Olarak Değiştir:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

22.11.2015 tarihinden itibaren 22/11/2015 tarihinde dönüştürülecek

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.