ไม่รู้จักสายอักขระเป็น DateTime ที่ถูกต้อง“ รูปแบบ dd / MM / yyyy”


172

dd/MM/yyyyฉันพยายามที่จะแปลงค่าสตริงที่จัดรูปแบบของฉันประเภทวันที่มีรูปแบบ

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

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

อะไรคือปัญหา ? IFormatProviderแต่ก็มีการแทนที่สองซึ่งถามหา นี่คืออะไร? อย่าฉันต้องผ่านนี้? ถ้าใช่จะใช้กับกรณีนี้ได้อย่างไร?

แก้ไข

อะไรคือความแตกต่างระหว่างParseและParseExact?

แก้ไข 2

คำตอบทั้งสองของ Slaks และ Sam ทำงานให้ฉันปัจจุบันผู้ใช้กำลังป้อนข้อมูล แต่ฉันมั่นใจได้ว่าพวกเขาใช้ได้โดยใช้ maskTextbox

คำตอบใดจะดีกว่าหากพิจารณาทุกด้านเช่นประเภทความปลอดภัยประสิทธิภาพหรือสิ่งที่คุณรู้สึก


7
@Edit: นั่นคือสิ่งที่เป็นเอกสารสำหรับ msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks

2
ParseExact สำหรับเมื่อคุณทราบรูปแบบที่แน่นอนของสตริงวันที่ Parse คือเมื่อคุณต้องการบางสิ่งบางอย่างที่สามารถจัดการบางสิ่งบางอย่างแบบไดนามิกมากขึ้น
gingerbreadboy

คำตอบ:


255

DateTime.ParseExactใช้

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

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

8
ทำไมเราต้องผ่านค่า null ที่นี่?
Shantanu Gupta

3
อินพุตอาจเป็น "22/11/2009 12:00:00 AM" หรือ "22/11/2009" นอกจากนี้วัฒนธรรมของเครื่องจักรพัฒนาอาจแตกต่างจากวัฒนธรรมของการผลิต ดังนั้นรหัสข้างต้นจะทำงานได้อย่างราบรื่น?
Rahatur

8
@Rahat การแยกวิเคราะห์ที่แน่นอนจะไม่ทำงานหากรูปแบบไม่ตรงกัน รูปแบบรูปแบบด้านบนเป็นdd/MM/yyyyสตริงข้อความที่มีเวลาอยู่ในนั้นจะไม่สามารถแยกวิเคราะห์ได้อย่างถูกต้อง คุณจะต้องตัดเวลาหรือรวมไว้ในรูปแบบการจัดรูปแบบ มีโอเวอร์โหลดจำนวนมากParseExactที่ยอมรับรูปแบบการจัดรูปแบบและจะแยกวิเคราะห์ข้อความหากตรงกับรูปแบบใดรูปแบบหนึ่ง
ซามูเอลเนฟฟ์

7
@SamuelNeff ทำไมคุณไม่ใช้CultureInfo.InvariantCultureแทนที่จะเป็นรูปแบบปัจจุบันหากคุณกำหนดรูปแบบแล้วล่ะ?
Alvin Wong

3
@Toolkit เหตุผลคือเครื่องหมายสแลชในสตริงรูปแบบไม่ใช่ตัวอักษรสแลช พวกมันจะถูกแทนที่ด้วยสตริงตัวแยกวันที่ในวัฒนธรรมปัจจุบัน ดังนั้นมันขึ้นอยู่กับวัฒนธรรมในแบบที่เขียนไว้ด้านบน ลองซามูเอลเนฟฟ์Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");มันจะทำให้ทางออกของคุณ ในการแก้ไขปัญหาให้ใช้"dd'/'MM'/'yyyy"(ปกป้องเครื่องหมายทับด้วยเครื่องหมายคำพูดเดี่ยว) หรือ@"dd\/MM\/yyyy"("หลบหนี" เครื่องหมายทับด้วยแบ็กสแลช)
Jeppe Stig Nielsen

44

คุณต้องโทรหาParseExactซึ่งจะแยกวิเคราะห์วันที่ซึ่งตรงกับรูปแบบที่คุณระบุ

ตัวอย่างเช่น:

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

IFormatProviderพารามิเตอร์ระบุวัฒนธรรมเพื่อใช้ในการแยกวัน เว้นแต่สตริงของคุณมาจากผู้ใช้คุณควรผ่าน
หากสตริงมาจากผู้ใช้คุณควรผ่านซึ่งจะใช้การตั้งค่าที่ผู้ใช้ระบุในตัวเลือกภูมิภาคในแผงควบคุมCultureInfo.InvariantCulture
CultureInfo.CurrentCulture


2
@Slaks: CultureInfo.InvariantCulture ไม่มีประโยชน์ในโค้ด ฉันจำเป็นต้องใช้เนมสเปซบ้าง
ไหม

3
using System.Globalization;
SLAK

2
คุณสามารถคลิกขวาที่ข้อผิดพลาดและคลิกแก้ไขสิ่งนี้จะใส่ในเนมสเปซที่ขาดหายไปสำหรับคุณ
Inkey

คุณยังสามารถคลิกสองครั้งที่ข้อผิดพลาดและดูลูกศรลงเพื่อแสดงเนมสเปซที่เกี่ยวข้องที่คุณสามารถใช้ได้
Usman Younas

ช่องว่างนับด้วยเช่นถ้ารูปแบบสตริงของคุณคือ "MM / dd / yyyy HH: mm: ss" (note - 2ช่องว่าง) - ดังนั้นรูปแบบของคุณสำหรับ ParseExact จะต้องรวมช่องว่างด้วย
Chris Halcrow

20

การแยกการแทนค่าสตริงของ DateTime เป็นสิ่งที่ยุ่งยากเนื่องจากวัฒนธรรมที่แตกต่างมีรูปแบบวันที่แตกต่างกัน สุทธิเป็นตระหนักถึงรูปแบบวันที่เหล่านี้และดึงพวกเขาจากการเพาะเลี้ยงในปัจจุบันของคุณ ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) เมื่อคุณเรียกDateTime.Parse(this.Text);

ตัวอย่างเช่นสตริง "22/11/2009" ไม่ตรงกับShortDatePatternสำหรับสหรัฐอเมริกา (en-US) แต่ตรงกับฝรั่งเศส (fr-FR)

ตอนนี้คุณสามารถโทรDateTime.ParseExactและส่งผ่านสตริงรูปแบบที่แน่นอนที่คุณคาดหวังหรือคุณสามารถส่งผ่านวัฒนธรรมที่เหมาะสมDateTime.Parseเพื่อแยกวันที่

ตัวอย่างเช่นการแยกวันที่ของคุณจะถูกต้อง:

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

แน่นอนคุณไม่ควรเลือกฝรั่งเศสแบบสุ่ม แต่เป็นสิ่งที่เหมาะสมกับความต้องการของคุณ

สิ่งที่คุณต้องคิดออกคือสิ่งที่System.Threading.Thread.CurrentThread.CurrentCultureตั้งไว้และถ้า / ทำไมมันแตกต่างจากสิ่งที่คุณคาดหวัง


โซลูชันของคุณไม่ทำงานสำหรับฉันมันให้ข้อผิดพลาดเช่น "String ไม่ได้รับการยอมรับว่าเป็น DateTime ที่ถูกต้อง" และฉันกำลังผ่านวันที่ป้อนข้อมูล: "13/06/17" ไปยังโซลูชันของคุณ แต่มีข้อผิดพลาดโปรดช่วยฉันด้วย
Ghanshyam Lakhani

16

แม้ว่าวิธีแก้ไขปัญหาข้างต้นจะมีผลบังคับใช้คุณสามารถปรับเปลี่ยนไฟล์ webconfig ได้ดังต่อไปนี้ ...

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

การอ้างอิง: รูปแบบวันที่และเวลาแตกต่างกันในเครื่องท้องถิ่นเปรียบเทียบกับเครื่องผลิต


1
Amit Philips คุณช่วยชีวิตฉันไว้แล้ว .. ฉันได้ลองทำทุกอย่างที่เป็นไปได้ และการเปลี่ยนแปลงเล็กน้อยนี้ได้ผล ขอบคุณ
RNH

1
ท่านเป็นบุตรของพระเจ้าอย่างแท้จริง
The Furious Bear

10

คุณอาจต้องระบุวัฒนธรรมสำหรับรูปแบบวันที่ที่ระบุใน:

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

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

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

สำหรับรายละเอียดเพิ่มเติมไปที่นี่:

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


4

หลังจากใช้เวลามากฉันได้แก้ไขปัญหาแล้ว

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

3

ใช้สิ่งนี้เพื่อแปลงสตริงเป็นวันที่และเวลา:

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


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

เช่นเดียวกับคนข้างต้นที่กล่าวว่าคุณสามารถส่งเป็นพารามิเตอร์สตริง แต่ต้องมีรูปแบบนี้: '20130121' และคุณสามารถแปลงเป็นรูปแบบนั้นได้โดยตรงจากตัวควบคุม ดังนั้นคุณจะได้รับตัวอย่างจากกล่องข้อความเช่น:

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

เพื่อแปลงเป็น: '20130121' คุณใช้:

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

เพื่อให้ SQL สามารถแปลงและวางลงในฐานข้อมูลของคุณ


0

คุณสามารถใช้

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


-6

เปลี่ยนด้วยตนเอง:

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

ตั้งแต่ 11/22/2015 มันจะถูกแปลงใน 22/11/2015

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.