Chuyển đổi DateTime? xâu chuỗi


11

Tôi muốn chuyển đổi một DateTime?chuỗi. Nếu một ngày là null thì trả về "", khác trả về một định dạng chuỗi như thế này : "2020-03-05T07:52:59.665Z". Mã này là một cái gì đó như thế này nhưng nó sẽ không hoạt động. Nó nói "DateTime?"không chứa định nghĩa cho "ToUniversalTime". Ai đó biết làm thế nào để khắc phục điều này?

DateTime? date = DateTime.UtcNow;

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

1
Nhân tiện, bạn chỉ muốn .ToString("o")?
— Giăng

Ồ, tôi đã sử dụng DateTime.UTCNow vì vậy tôi không cần sử dụng ToUniversalTime () nữa? @John. À tôi hiểu rồi .ToString("o"), tôi sẽ nghiên cứu thêm. Cảm ơn bạn!
— camahe

1
Thật vậy, và giả sử bạn chỉ muốn một định dạng ISO8601, bạn có thể sử dụng "o". Xem tài liệu
— John

@ John: "o" sử dụng độ chính xác đánh dấu, có thể không được mong muốn mặc dù nó tuân thủ ISO-8601.
— Jon Skeet

1
"Nhưng khi tôi sử dụng .ToString (" o "), nó không có Z" - nếu bạn vẫn gọi ToUniversalTime (); 'Z' xuất phát từ việc nó có một loại UTC.
— Jon Skeet

Câu trả lời:


16

Ngày giờ? có một tài sản Giá trị và một tài sản HasValue

Thử:

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

Bạn có thể sử dụng phiên bản ngắn:

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

8

Mặc dù bạn có thể sử dụng thuộc Valuetính trực tiếp theo câu trả lời của Leszek, nhưng tôi có thể sử dụng toán tử có điều kiện null kết hợp với toán tử hợp nhất null:

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

Ở đây, ?.ý chí sẽ chỉ dẫn đến một giá trị null nếu datelà null và ??toán tử sẽ cung cấp một giá trị mặc định nếu kết quả của date?.ToUniversalTime().ToString(...)cuộc gọi là null (điều này sẽ chỉ xảy ra nếu datelà null).

Lưu ý rằng bạn thực sự muốn chỉ định văn hóa bất biến để tránh nhận kết quả không mong muốn khi văn hóa của chủ đề hiện tại không sử dụng lịch Gregorian và bạn không cần trích dẫn tất cả những từ đó trong chuỗi định dạng. Nó chắc chắn hoạt động khi bạn làm như vậy, nhưng đọc IMO khó hơn.

Nếu bạn không quan tâm đến độ chính xác được thể hiện trong chuỗi, bạn có thể làm cho mã đơn giản hơn bằng cách sử dụng chuỗi định dạng chuẩn "O" :

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

Tại thời điểm đó, bạn không cần chỉ định CultureInfo.InvariantCulturevì luôn được sử dụng bởi "O".


1
Tại sao không sử dụng "O"như một chuỗi định dạng? docs.microsoft.com/en-us/dotnet/standard/base-types/...
— Zohar Peled

1
@ZoharPeled: Điều đó có độ chính xác đánh dấu và OP dường như chỉ muốn độ chính xác đến mili giây.
— Jon Skeet

Thật ra tôi muốn một định dạng có Zở cuối chuỗi
— camahe

1
@camahe: Trình xác định định dạng "O" đã sử dụng điều đó - xem liên kết tài liệu mà Zohar đã đăng. Nếu bạn thực sự không quan tâm bạn có bao nhiêu chữ số chính xác, thì việc sử dụng "O" sẽ đơn giản hơn rất nhiều - bạn cũng không cần phải chỉ định CultureInfo.InvariantCARM trong trường hợp đó. Sẽ sửa đổi câu trả lời để thêm vào đó như là một tùy chọn.
— Jon Skeet

2
@camahe: Vui lòng rút ra một bài học từ điều này khi bạn đặt câu hỏi, điều đó sẽ giúp thực sự chính xác trong yêu cầu của bạn.
— Jon Skeet
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.