可以为空的日期时间转换错误

时间:2016-06-21 13:58:27

标签: c# parsing datetime nullable

我正在读取可能在其中包含未格式化日期或空格的字段值,我需要将填充字段中的字符串转换为datetime并将其写回。我正在尝试以下但是得到错误“Nullable对象必须有一个值”:

DateTime? localVersion = null;
DateTime? serverVersion = null;

if(!string.IsNullOrWhiteSpace(item.cellValueLocal))
{
    localVersion = DateTime.ParseExact(item.cellValueLocal, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture);
}

if (!string.IsNullOrWhiteSpace(item.cellValueServer))
{
    serverVersion = DateTime.ParseExact(item.cellValueServer, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture);
}

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);

任何人都可以提供有关此问题的指导吗?

3 个答案:

答案 0 :(得分:3)

如果您的cellValue为null(或空格),则不会初始化DateTime实例,仍然会将其设置为null。如果没有值,则无法在可空的实例上访问.Value。 您必须先查看.HasValue

if (localVersion.HasValue) {
  localVersion.Value.ToString(...);
}

答案 1 :(得分:1)

行:

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);

是错误。如果item.cellValueLocalitem.cellValueServer为空或为空,则localVersion.ValueserverVersion.Value永远不会被赋予非空值,因此Value将抛出异常你可以访问它。

您需要将操作替换为:

if (localVersion.HasValue)
    localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);

或者,您可以使用空合并运算符:

DateTime version = localVersion ?? DateTime.Now;

使用适当的默认值替换DateTime.Now。在C#6中,您可以使用?.语法将其进一步简化为:

string version = localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) ?? String.Empty;

null检查内联。

答案 2 :(得分:0)

如果您正在编译最新版本的c#(6.0)编译器,那么您可以将其进一步缩短为

localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)