Chuỗi không được công nhận là định dạng DateTime Thời gian dd / MM / yyyy hợp lệ


172

Tôi đang cố gắng chuyển đổi giá trị định dạng chuỗi của tôi thành loại ngày với định dạng dd/MM/yyyy.

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

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

Vấn đề là gì? Nó có một ghi đè thứ hai yêu cầu IFormatProvider. Cái này là cái gì? Đừng tôi cần phải vượt qua điều này cũng? Nếu có làm thế nào để sử dụng nó cho trường hợp này?

Biên tập

Sự khác biệt giữa Parsevà là ParseExactgì?

Chỉnh sửa 2

Cả hai câu trả lời của Slaks và Sam đều làm việc cho tôi, hiện tại người dùng đang đưa ra đầu vào nhưng điều này sẽ được tôi đảm bảo rằng chúng hợp lệ bằng cách sử dụng maskTextbox.

Câu trả lời nào tốt hơn khi xem xét tất cả các khía cạnh như loại saftey, hiệu suất hoặc thứ gì đó bạn cảm thấy thích


7
@ Chỉnh sửa: Đó là những gì tài liệu dành cho. msdn.microsoft.com/en-us/l
Library / w2sa9yss.aspx

2
ParseExact dành cho khi bạn biết định dạng chính xác của chuỗi ngày, Parse là khi bạn muốn thứ gì đó có thể xử lý thứ gì đó năng động hơn một chút.
gingerbreadboy

Câu trả lời:


255

Sử dụng DateTime.ParseExact.

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

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

8
Tại sao chúng ta phải vượt qua null ở đây?
Chaianu Gupta

3
Đầu vào có thể là "22/11/2009 12:00:00 AM" hoặc "22/11/2009". Ngoài ra văn hóa của bộ máy phát triển có thể khác với văn hóa sản xuất. Vì vậy, các mã trên sẽ làm việc liền mạch?
La

8
@Rahat, phân tích chính xác sẽ không hoạt động nếu định dạng không khớp. Mẫu định dạng ở trên là dd/MM/yyyymột chuỗi văn bản có thời gian trong đó sẽ không được phân tích cú pháp đúng. Bạn sẽ cần phải loại bỏ thời gian hoặc đưa nó vào mẫu định dạng. Có một sự quá tải ParseExactchấp nhận một loạt các mẫu định dạng và sẽ phân tích văn bản nếu nó phù hợp với bất kỳ mẫu nào trong số chúng.
Samuel Neff

7
@SamuelNeff Tại sao bạn không sử dụng CultureInfo.InvariantCulturethay vì hiện tại nếu bạn đang xác định một định dạng?
Alvin Wong

3
@Toolkit Lý do là các dấu gạch chéo trong chuỗi định dạng không phải là dấu gạch chéo. Chúng được thay thế bằng chuỗi phân tách ngày trong văn hóa hiện tại. Vì vậy, nó phụ thuộc vào văn hóa theo cách nó được viết ở trên. Samuel Neff, hãy thử Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, nó sẽ phá vỡ giải pháp của bạn. Để khắc phục điều đó, hãy sử dụng "dd'/'MM'/'yyyy"(bảo vệ dấu gạch chéo bằng dấu ngoặc đơn) hoặc @"dd\/MM\/yyyy"("thoát" dấu gạch chéo bằng dấu gạch chéo ngược).
Jeppe Stig Nielsen

44

Bạn cần gọi ParseExact, phân tích một ngày phù hợp chính xác với định dạng mà bạn cung cấp.

Ví dụ:

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

Các IFormatProvidertham số xác định văn hóa sử dụng để phân tích ngày.
Trừ khi chuỗi của bạn đến từ người dùng, bạn nên vượt qua CultureInfo.InvariantCulture.
Nếu chuỗi xuất phát từ người dùng, bạn sẽ vượt qua CultureInfo.CurrentCulture, chuỗi này sẽ sử dụng các cài đặt mà người dùng đã chỉ định trong Tùy chọn khu vực trong Bảng điều khiển.


2
@Slaks: CultureInfo.InvariantCARM không có sẵn trong mã. Tôi có cần sử dụng một số không gian tên
Chaianu Gupta

3
using System.Globalization;
SLaks

2
Bạn cũng có thể nhấp chuột phải vào lỗi và nhấp vào giải quyết điều này sẽ đặt vào không gian tên bị thiếu cho bạn.
Inkey

bạn cũng có thể nhấp đúp vào lỗi và thấy một mũi tên xuống hiển thị các không gian tên liên quan bạn có thể sử dụng
Usman Younas

Không gian cũng được tính, vì vậy, ví dụ nếu định dạng chuỗi của bạn là "MM / dd / yyyy HH: mm: ss" (lưu ý - 2 dấu cách) - thì định dạng của bạn cho ParseExact cũng phải bao gồm các khoảng trắng
Chris Halcrow

20

Phân tích cú pháp đại diện chuỗi của DateTime là một điều khó khăn vì các nền văn hóa khác nhau có các định dạng ngày khác nhau. .Net nhận thức được các định dạng ngày này và lấy chúng từ văn hóa hiện tại của bạn ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) khi bạn gọi DateTime.Parse(this.Text);

Ví dụ: chuỗi "22/11/2009" không khớp với ShortDatePotype cho Hoa Kỳ (en-US) nhưng nó phù hợp với Pháp (fr-FR).

Bây giờ, bạn có thể gọi DateTime.ParseExactvà chuyển qua chuỗi định dạng chính xác mà bạn mong đợi hoặc bạn có thể chuyển qua một nền văn hóa thích hợp DateTime.Parseđể phân tích ngày.

Ví dụ, điều này sẽ phân tích chính xác ngày của bạn:

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

Tất nhiên, bạn không nên chọn ngẫu nhiên Pháp, nhưng một cái gì đó phù hợp với nhu cầu của bạn.

Những gì bạn cần tìm ra là những gì System.Threading.Thread.CurrentThread.CurrentCultuređược đặt thành, và nếu / tại sao nó khác với những gì bạn mong đợi.


giải pháp của bạn không hoạt động đối với tôi, nó đưa ra lỗi như "Chuỗi không được công nhận là DateTime hợp lệ." và tôi đang chuyển ngày đầu vào sau: "13/06/17" cho giải pháp của bạn nhưng nó báo lỗi. Xin hãy giúp tôi.
Ghanshyam Lakhani

16

Mặc dù các giải pháp trên có hiệu quả, bạn cũng có thể sửa đổi tệp webconfig bằng ...

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

Tham chiếu: Định dạng ngày giờ khác nhau trên máy cục bộ so với máy sản xuất


1
Amit Philips, bạn đã cứu ngày của tôi .. Tôi đã thử tất cả những điều có thể. Và thay đổi nhỏ này hoạt động. Cảm ơn.
RNH

1
Amit, bạn thực sự là con trai của Thiên Chúa.
Gấu Furious


4

Sau khi dành nhiều thời gian tôi đã giải quyết được vấn đề

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

3

sử dụng điều này để chuyển đổi chuỗi thành datetime:

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

3

Dựa trên tài liệu tham khảo này , cách tiếp cận tiếp theo có hiệu quả với tôi:

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

Giống như ai đó ở trên cho biết bạn có thể gửi nó dưới dạng tham số chuỗi nhưng nó phải có định dạng này: '20130121' chẳng hạn và bạn có thể chuyển đổi nó sang định dạng đó lấy trực tiếp từ điều khiển. Vì vậy, bạn sẽ lấy nó ví dụ từ một hộp văn bản như:

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

để chuyển đổi nó thành: '20130121' bạn sử dụng:

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

để SQL có thể chuyển đổi nó và đưa nó vào cơ sở dữ liệu của bạn.


0

Bạn cũng có thể sử dụng

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

Làm việc cho tôi dưới đây mã:

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

Không gian tên

using System.Globalization;

-6

Thay đổi bằng tay:

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

Từ ngày 22/11/2015 nó sẽ được chuyển đổi vào ngày 22/11/2015

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.