แปลง DateTime หรือไม่ เพื่อสตริง


11

ฉันต้องการแปลง a เป็นDateTime?สตริง ถ้าวันที่เป็นโมฆะแล้วกลับอื่นกลับรูปแบบสตริงเช่นนี้:"" "2020-03-05T07:52:59.665Z"รหัสคืออะไรแบบนี้ แต่มันจะไม่ทำงาน มันบอกว่า"DateTime?"ไม่มีคำนิยามสำหรับ "ToUniversalTime" มีคนรู้วิธีแก้ไขปัญหานี้หรือไม่

DateTime? date = DateTime.UtcNow;

var dateInUTCString = date == null ? "" : date.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

1
โดยวิธีการที่คุณต้องการเพียงแค่.ToString("o")?
John

โอ้ฉันใช้ DateTime แล้วUTCNowแล้วดังนั้นฉันไม่จำเป็นต้องใช้ ToUniversalTime () อีกต่อไปใช่ไหม @จอห์น. ฉันเข้าใจ.ToString("o")แล้วฉันจะค้นคว้าเพิ่มเติม ขอบคุณ!
camahe

1
แน่นอนและสมมติว่าคุณต้องการรูปแบบ ISO8601 คุณสามารถใช้ "o" ดูเอกสาร
John

@John: "o" ใช้ความแม่นยำในการทำเครื่องหมายซึ่งอาจไม่เป็นที่ต้องการแม้ว่าจะเป็นไปตามมาตรฐาน ISO-8601
Jon Skeet

1
"แต่เมื่อฉันใช้. ToString (" o ") มันไม่มี Z" - ถ้าคุณยังใช้ ToUniversalTime (); 'Z' มาจากการที่มี UTC ชนิดหนึ่ง
Jon Skeet

คำตอบ:


16

วันที่? มีคุณสมบัติค่าและคุณสมบัติ HasValue

ลอง:

var dateInUTCString = date.HasValue ? date.Value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") : "";

คุณสามารถใช้เวอร์ชั่นสั้น:

var dateInUTCString = date?.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") ?? "";

8

ในขณะที่คุณสามารถใช้Valueคุณสมบัติได้โดยตรงตามคำตอบของ Leszek ฉันอาจใช้ตัวดำเนินการแบบมีเงื่อนไขร่วมกับตัวดำเนินการ null-coalescing:

string dateInUTCString =
    date?.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture) 
    ?? "";

นี่?.จะส่งผลให้มีค่าว่างถ้าdateเป็นโมฆะและ??ผู้ประกอบการจะให้ค่าเริ่มต้นหากผลลัพธ์ของการdate?.ToUniversalTime().ToString(...)โทรเป็นโมฆะ (ซึ่งจะเกิดขึ้นหากdateเป็นโมฆะ) เท่านั้น

โปรดทราบว่าคุณต้องการระบุวัฒนธรรมที่ไม่เปลี่ยนแปลงเพื่อหลีกเลี่ยงการได้รับผลลัพธ์ที่ไม่คาดคิดเมื่อวัฒนธรรมของเธรดปัจจุบันไม่ได้ใช้ปฏิทินแบบคริสต์ศักราชและคุณไม่จำเป็นต้องอ้างถึงตัวอักษรทั้งหมดในสตริงรูปแบบ มันทำงานได้ดีเมื่อคุณทำเช่นนั้น แต่มันยากที่จะอ่าน IMO

หากคุณไม่สนใจว่าจะแสดงความแม่นยำเท่าใดในสตริงคุณสามารถทำให้โค้ดง่ายขึ้นโดยใช้สตริงรูปแบบมาตรฐาน "O" :

string dateInUTCString = date?.ToUniversalTime().ToString("O") ?? "";

ณ จุดนี้คุณไม่จำเป็นต้องระบุCultureInfo.InvariantCultureว่า"O" ถูกใช้งานเสมอ


1
ทำไมไม่ใช้"O"เป็นสตริงรูปแบบ docs.microsoft.com/en-us/dotnet/standard/base-types/ …
Zohar Peled

1
@ZoharPeled: นั่นมีความแม่นยำติ๊กและเห็นได้ชัดว่า OP ต้องการความแม่นยำเพียงมิลลิวินาทีเท่านั้น
Jon Skeet

ที่จริงฉันต้องการรูปแบบที่มีZในตอนท้ายของสตริง
camahe

1
@camahe: ตัวระบุรูปแบบ "O" ใช้แล้ว - ดูลิงค์เอกสารที่ Zohar โพสต์ หากคุณไม่ทราบว่าคุณได้รับตัวเลขที่แม่นยำเพียงใดการใช้ "O" จะง่ายกว่ามาก - คุณไม่จำเป็นต้องระบุ CultureInfo.InvariantCulture จะแก้ไขคำตอบเพื่อเพิ่มว่าเป็นตัวเลือก
Jon Skeet

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