String tidak dikenali sebagai DateTime "format dd / MM / yyyy" yang valid

172

Saya mencoba mengonversi nilai diformat string saya ke tipe tanggal dengan format dd/MM/yyyy.

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

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

Apa masalahnya ? Ini memiliki penggantian kedua yang meminta IFormatProvider. Apa ini? Apakah saya perlu melewati ini juga? Jika Ya bagaimana menggunakannya untuk kasus ini?

Edit

Apa perbedaan antara Parsedan ParseExact?

Edit 2

Baik jawaban Slaks dan Sam berfungsi untuk saya, saat ini pengguna memberikan input tetapi ini akan meyakinkan saya bahwa mereka valid dengan menggunakan maskTextbox.

Jawaban mana yang lebih baik mengingat semua aspek seperti tipe keselamatan, kinerja atau sesuatu yang Anda sukai

Shantanu Gupta
sumber
7
@ Edit: Untuk itulah dokumentasinya. msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks
2
ParseExact adalah ketika Anda mengetahui format persis dari string tanggal, Parse adalah ketika Anda menginginkan sesuatu yang dapat menangani sesuatu yang sedikit lebih dinamis.
gingerbreadboy

Jawaban:

255

Gunakan DateTime.ParseExact.

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

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Samuel Neff
sumber
8
Kenapa kita harus lulus nol di sini?
Shantanu Gupta
3
Input dapat "22/11/2009 12:00:00 AM" atau "22/11/2009". Juga budaya mesin pengembangan dapat berbeda dari budaya produksi. Jadi, apakah kode di atas akan berfungsi dengan mulus?
Rahatur
8
@ Rahat, parse pastinya tidak akan berfungsi jika formatnya tidak cocok. Pola format di atas dd/MM/yyyysedemikian sehingga string teks dengan waktu di dalamnya tidak akan diuraikan dengan benar. Anda harus menghapus waktu atau memasukkannya ke dalam pola format. Ada kelebihan ParseExactyang menerima array pola format dan akan mem-parsing teks jika cocok dengan salah satu dari mereka.
Samuel Neff
7
@SamuelNeff Mengapa Anda tidak menggunakan CultureInfo.InvariantCultureyang saat ini jika Anda mendefinisikan suatu format?
Alvin Wong
3
@ Toolkit Alasannya adalah bahwa garis miring dalam string format bukan garis miring secara harfiah. Mereka diganti dengan string pemisah tanggal dalam budaya saat ini. Jadi itu tergantung pada budaya seperti yang tertulis di atas. Samuel Neff, cobalah Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, itu akan menghancurkan solusi Anda. Untuk memperbaikinya, gunakan "dd'/'MM'/'yyyy"(melindungi garis miring dengan tanda kutip tunggal), atau @"dd\/MM\/yyyy"("melarikan diri" garis miring dengan garis miring terbalik).
Jeppe Stig Nielsen
44

Anda perlu menelepon ParseExact, yang mem-parsing tanggal yang sama persis dengan format yang Anda berikan.

Sebagai contoh:

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

The IFormatProviderparameter menentukan budaya untuk menggunakan untuk mengurai tanggal.
Kecuali jika string Anda berasal dari pengguna, Anda harus lulus CultureInfo.InvariantCulture.
Jika string memang berasal dari pengguna, Anda harus lulus CultureInfo.CurrentCulture, yang akan menggunakan pengaturan yang ditentukan pengguna dalam Opsi Regional di Panel Kontrol.

Slaks
sumber
2
@ Slaks: CultureInfo.InvariantCulture tidak tersedia dalam kode. Apakah saya perlu menggunakan beberapa namespace
Shantanu Gupta
3
using System.Globalization;
SLaks
2
Anda juga dapat mengklik kanan pada kesalahan dan klik atasi ini akan menempatkan namespace yang hilang untuk Anda.
Inkey
Anda juga dapat mengklik dua kali kesalahan dan melihat panah bawah yang menunjukkan ruang nama terkait yang dapat Anda gunakan
Usman Younas
Spaces juga dihitung, jadi misalnya jika format string Anda adalah "MM / hh / tttt HH: mm: dd" (catatan - 2 spasi) - maka format Anda untuk ParseExact juga harus menyertakan spasi
Chris Halcrow
20

Mem-parsing representasi string dari DateTime adalah hal yang rumit karena budaya yang berbeda memiliki format tanggal yang berbeda. .Net mengetahui format tanggal ini dan menariknya dari budaya Anda saat ini ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) saat Anda menelepon DateTime.Parse(this.Text);

Misalnya, string "22/11/2009" tidak cocok dengan ShortDatePattern untuk Amerika Serikat (en-AS) tetapi cocok dengan Prancis (fr-FR).

Sekarang, Anda bisa memanggil DateTime.ParseExactdan meneruskan string format persis yang Anda harapkan, atau Anda bisa meneruskan budaya yang sesuai DateTime.Parseuntuk menguraikan tanggal.

Misalnya, ini akan menguraikan tanggal Anda dengan benar:

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

Tentu saja, Anda tidak hanya harus memilih Prancis secara acak, tetapi sesuatu yang sesuai dengan kebutuhan Anda.

Yang perlu Anda ketahui adalah apa System.Threading.Thread.CurrentThread.CurrentCultureyang ditetapkan, dan jika / mengapa itu berbeda dari yang Anda harapkan.

Greg
sumber
solusi Anda tidak berfungsi untuk saya itu memberikan kesalahan seperti "String tidak dikenali sebagai DateTime yang valid." dan saya melewati tanggal input berikut: "13/06/17" untuk solusi Anda tetapi memberikan error.Plz bantu saya.
Ghanshyam Lakhani
16

Meskipun solusi di atas efektif, Anda juga dapat memodifikasi file konfigurasi web dengan ...

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

Ref: Format datetime berbeda pada mesin lokal dibandingkan dengan mesin produksi

Amit Philips
sumber
1
Amit Philips, Anda menyelamatkan hari saya .. Saya telah mencoba semua hal yang mungkin. Dan perubahan kecil ini berhasil. Terima kasih.
RNH
1
Amit, Anda benar-benar putra Allah.
The Furious Bear
10

Anda mungkin perlu menentukan budaya untuk format tanggal tertentu seperti di:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

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

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

Untuk lebih jelasnya buka di sini:

http://msdn.microsoft.com/en-us/library/5hh873ya.aspx

Ricardo Sanchez
sumber
4

Setelah menghabiskan banyak waktu saya menyelesaikan masalah

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

gunakan ini untuk mengonversi string ke datetime:

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

Berdasarkan referensi ini , pendekatan selanjutnya bekerja untuk saya:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
Jesús Castro
sumber
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;
}
Bala Kumar
sumber
1

Sama seperti seseorang di atas mengatakan Anda dapat mengirimnya sebagai parameter string tetapi harus memiliki format ini: '20130121' misalnya dan Anda dapat mengonversinya ke format itu dengan mengambilnya langsung dari kontrol. Jadi Anda akan mendapatkannya misalnya dari kotak teks seperti:

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

untuk mengubahnya menjadi: '20130121' yang Anda gunakan:

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

sehingga SQL dapat mengonversinya dan memasukkannya ke dalam basis data Anda.

G Jeny Ramirez
sumber
0

Anda juga bisa menggunakannya

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
Serkan Hekimoglu
sumber
0

Bekerja untuk saya di bawah kode:

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

Namespace

using System.Globalization;
Anjan Kant
sumber
-6

Ubah Secara Manual:

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

Mulai 11/22/2015 akan dikonversi pada 22/11/2015

sarta
sumber