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


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

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.


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.


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


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


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]);

3

gunakan ini untuk mengonversi string ke datetime:

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

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

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

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.


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

0

Bekerja untuk saya di bawah kode:

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

Namespace

using System.Globalization;

-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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.