Làm cách nào để chuyển đổi DateTime? đến DateTime


171

Tôi muốn chuyển đổi một DateTime nullable (DateTime? ) không thể thành một DateTime, nhưng tôi gặp lỗi:

Không thể chuyển đổi ngầm định loại 'System.DateTime?' đến 'System.DateTime'. Một chuyển đổi rõ ràng tồn tại (bạn đang thiếu một diễn viên?)

Tôi đã thử như sau:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;

Câu trả lời:


304

Bạn muốn sử dụng toán tử hợp nhất null , được thiết kế cho chính xác mục đích này.

Sử dụng nó, bạn kết thúc với mã này.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

1
đây là đoạn trích tôi đã sử dụng trong Người thuyết trình điền vào chế độ xem với Ngày / Giờ không thể xóa: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram

'Ngày giờ?' liều không chứa định nghĩa cho 'Ngày cập nhật'
Vasil Valchev

88

MS đã tạo một phương thức cho việc này, vì vậy bạn không phải sử dụng toán tử hợp nhất null. Không có sự khác biệt về chức năng, nhưng sẽ không dễ dàng hơn cho những người không phải là chuyên gia để có được những gì đang xảy ra trong nháy mắt.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);

43

Thử cái này

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

Điều quan trọng ở đây là toán tử hợp nhất null, xem câu trả lời của chills42 để biết thêm thông tin.
cspolton

24

Bạn có thể sử dụng một dàn diễn viên đơn giản:

DateTime dtValue = (DateTime) dtNullAbleSource;

Như Leandro Tupone đã nói, bạn phải kiểm tra xem var có null không


6
Hoàn hảo nếu bạn kiểm tra xem var có null trước +1 không
Leandro

22

Bạn cần gọi thuộc tính Giá trị của DateTime nullable. Điều này sẽ trả về một DateTime.

Giả sử UpdatedDatelà vậy DateTime?, thì cái này sẽ hoạt động:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

Để làm cho mã dễ đọc hơn một chút, bạn có thể sử dụng thuộc tính HasValue thay vì nullkiểm tra:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue
                          ? _objHotelPackageOrder.UpdatedDate.Value
                          : DateTime.Now;

Điều này có thể được thực hiện thậm chí ngắn gọn hơn:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

6

Làm thế nào về những điều sau đây:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;

6

Đây là đoạn trích tôi đã sử dụng trong Người thuyết trình điền vào chế độ xem với Ngày / Giờ không thể xóa được

memDateLogin = m.memDateLogin ?? DateTime.MinValue


1

Xem xét sử dụng những điều sau đây tốt hơn nhiều so với câu trả lời được chấp nhận

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;

Quan tâm để nói tại sao nó tốt hơn?
n4rzul

0

Thử cái này:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;

4
Nó được coi là hình thức tốt để giải thích các đề xuất / câu trả lời của bạn. Mã chỉ có câu trả lời có thể không đáng ngạc nhiên, ngay cả khi chúng đúng về mặt kỹ thuật.
Maximilian Ast

1
@Maximilian Có bạn đúng sẽ cố gắng thực hiện theo cách bạn đã đề xuất :)
Harsh Vyas
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.