转换日期时间?串


11

我想将a转换DateTime?为字符串。如果日期为null,则返回"",否则返回类似以下的字符串格式:"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

Answers:


16

日期时间?有一个Value属性和一个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条件运算符和null-coalescing运算符:

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

在这里,?.如果date为null,则将导致null值;如果调用??的结果为null,则操作员将提供默认值date?.ToUniversalTime().ToString(...)(仅当date为null时)。

请注意,您确实想指定不变的区域性,以避免当当前线程的区域性不使用公历时,并且不需要在格式字符串中引用所有这些文字时,得到意想不到的结果。当然可以当您这样做时,,但是很难阅读IMO。

如果您不介意在字符串中表达多少精度,则可以使用“ O”标准格式字符串使代码更简单:

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

此时,您无需指定CultureInfo.InvariantCulture,因为“ O” 始终使用该名称。


1
为什么不用"O"作格式字符串? docs.microsoft.com/en-us/dotnet/standard/base-types/...
琐佩莱德

1
@ZoharPeled:具有刻度精度,并且OP显然只需要毫秒精度。
Jon Skeet

实际上,我想要的Z是字符串末尾的格式
camahe

1
@camahe:“ O”格式说明符已经在使用它-请参阅Zohar发布的文档链接。如果您真的不介意获得多少位数的精度,则使用“ O”会更简单-在这种情况下,也无需指定CultureInfo.InvariantCulture。将修改答案以将其添加为选项。
乔恩·斯基特

2
@camahe:请大家以此为鉴,当你问一个问题,它有助于是真的在你的要求精确。
乔恩·斯基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.