转换日期时间?串起来

cam*_*ahe 11 c#

我想将 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'");
Run Code Online (Sandbox Code Playgroud)

Les*_*zur 17

DateTime?拥有Value财产和HasValue财产

尝试:

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

您可以使用简短版本:

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


Jon*_*eet 9

虽然您可以Value根据 Leszek 的回答直接使用该属性,但我可能会将空条件运算符与空合并运算符结合使用:

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

在这里,?.如果date为空,则只会产生空值,如果调用??的结果为空,则运算符将提供默认值date?.ToUniversalTime().ToString(...)(只有在date为空时才会发生)。

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

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

string dateInUTCString = date?.ToUniversalTime().ToString("O") ?? "";
Run Code Online (Sandbox Code Playgroud)

那时您不需要指定CultureInfo.InvariantCulture,因为“O”总是使用它。

  • @camahe:请从中吸取教训,当您提出问题时,“真正”准确地表达您的要求会有所帮助。 (3认同)