ค่าทศนิยมที่รับรู้เป็น DateTime แทนที่จะส่งคืนค่าเท็จจาก DateTime.Parse


9

ฉันต้องทำการตรวจสอบตามค่าสตริงไม่ว่าจะเป็นวันที่หรือทศนิยม แต่แยกวันที่กลับจริงสำหรับทศนิยม

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

3/5/2019ก็จะส่งกลับวันที่ถูกต้อง

จะตรวจสอบความถูกต้องของสตริงเพื่อทราบวันที่ที่ถูกต้องเมื่อไม่ทราบรูปแบบวันที่?


6
ตรวจสอบทศนิยมก่อนหรือไม่ หรือใช้DateTime.ParseExactถ้าคุณรู้ว่ารูปแบบใดที่สามารถ / ควรใช้
เพื่อนที่

3
คุณสามารถใช้TryParseExactและระบุรูปแบบวันที่ที่ถูกต้อง
juharr

5
แน่นอน - DateTime.Parseลองหลายรูปแบบ หากคุณต้องการจดจำสิ่งที่เจาะจงให้ลองแยกวิเคราะห์โดยเฉพาะ
Jon Skeet

คำตอบ:


3

"วิธีการตรวจสอบสตริงเพื่อทราบวันที่ที่ถูกต้อง"

ปัญหาคือการที่"3.5" จะถือว่าเป็นวันที่ถูกต้อง (และยังมีทศนิยม)

หากคุณต้องการให้ทศนิยมเป็น "win" เสมอ (เช่นคุณไม่ต้องการisDateและisDecimalเป็นทั้งสองอย่างtrue) ให้ใส่เครื่องหมายเช็คในการตรวจสอบความถูกต้องด้วย

วิธีหนึ่งในการทำคือใช้TryParseวิธีการ (ซึ่งคืนค่า a boolหากสตริงสามารถวิเคราะห์คำเป็นชนิดและตั้งoutค่าพารามิเตอร์เป็นค่าที่แปลง) เพื่อพิจารณาว่าสตริงสามารถแปลงเป็นชนิดได้หรือไม่ตัวอย่างเช่น

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);

ฉันได้ลองไปแล้ว แต่ 3.5 เป็นวันที่ที่ถูกต้องและเป็นทศนิยมที่ถูกต้องดังนั้นจึงไม่ช่วยเลย
Munawar

1
ในโค้ดข้างต้นisDateเป็นเพราะมีการตรวจสอบหาfalse isDecimalนั่นไม่ใช่สิ่งที่คุณต้องการหรือ
รูฟัส L

2
@Munawar - "3.5 เป็นวันที่ที่ถูกต้องและทศนิยมที่ถูกต้อง" ถ้าเราเป็นมนุษย์นั้นจะมีสตริงที่และไม่มีบริบทอื่น ๆที่เราไม่ทราบว่าจะมีเจตนาให้เป็นวันที่ทศนิยมหรือบางสิ่งบางอย่างที่เป็นไปได้อื่น ๆ คุณไม่สามารถคาดหวังได้ว่าคอมพิวเตอร์จะได้คำตอบอย่างน่าอัศจรรย์
Damien_The_Unbeliever

ใช่คำตอบนี้เฉพาะเจาะจงกับปัญหาและแก้ไขปัญหาของฉันแม้ว่า ParseExact จะเหมาะสมที่สุดหากรู้จักรูปแบบ
Munawar

คุณยังมีปัญหาเมื่อรูปแบบวันที่คือ "12122019"
Athanasios Kataras

6

ตรวจสอบเอกสารอย่างเป็นทางการเกี่ยวกับ ParseExact

หากคุณรู้ว่าการเป็นตัวแทนที่แน่นอนคุณสามารถทำสิ่งนี้:

  format = "ddd dd MMM yyyy h:mm tt zzz";
  try {
     result = DateTime.ParseExact(dateString, format, provider);
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("{0} is not in the correct format.", dateString);
  }

หากคุณไม่ทราบว่าคุณติดอยู่กับการตีความทางวัฒนธรรม

แยกสตริงวันที่และเวลาโดยใช้ระเบียบของวัฒนธรรมที่เฉพาะเจาะจง การแยกวิเคราะห์ (สตริง IFormatProvider) โอเวอร์โหลด (ดูการแยกวิเคราะห์และวัฒนธรรม)


ไม่ทราบว่ารูปแบบอาจเป็นไปตามความต้องการของผู้ใช้
Munawar

1
@ Munawar คุณจะแยกความแตกต่างระหว่าง 1/3/2019 และ 3/1/2019 ในสถานการณ์นั้นได้อย่างไร
Blaise

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