【问题标题】:Dateformat with nullable variable具有可为空变量的日期格式
【发布时间】:2009-11-23 15:55:29
【问题描述】:

我有这个代码:

 startWeekDate = startWeekDate == null ? DateTimeHelpers.calcMondayDate(DateTime.Now) : DateTimeHelpers.calcMondayDate(startWeekDate.Value);
 DateTime endWeekDate = startWeekDate.Value.AddDays(6);

startWeekDate 是一个可以为空的参数。这很好用,但我想将其格式化为: String.Format("{d:0}", .... ) 但是当我在它周围拍打时会出错。

不能将类型'string'隐式转换为'System.DateTime?

我该如何解决这个问题?

/M

编辑:

我正在尝试将其添加到函数中,因为它应该始终返回没有时钟的 dateformat,但我在此代码中遇到了同样的错误:

    public static DateTime calcMondayDate(DateTime input)
    {
        int delta = DayOfWeek.Monday - input.DayOfWeek;
        DateTime monday = String.Format("{d:0}", input.AddDays(delta));

        return monday;
    }

无法将类型“字符串”隐式转换为“System.DateTime”

嗯,但是输入的是DateTime,为什么抱怨它是字符串?

【问题讨论】:

  • startWeekDate 究竟是什么可空类型?
  • 公开.....(DateTime?startWeekDate)
  • 如果 var 值为 null,您希望格式化后的字符串是什么?
  • 哦,等等,你是在尝试 startWeekDate = String.Format(...) 吗?

标签: c#


【解决方案1】:

您展示了没有有问题的代码,但没有展示有问题的代码。请显示无法编译的代码。它听起来就像您正在尝试为 DateTime? 变量分配一个字符串值,例如

startWeekDate = string.Format(...);

这绝对行不通。一旦你把它作为一个字符串,你真的希望它对格式化的值做什么?在你想要字符串的地方使用它,而不是在你想要 DateTime? 的地方。

要补充一点 - 你的第一行可以更简单地表达:

startWeekDate = DateTimeHelpers.calcMondayDate(startWeekDate ?? DateTime.Now);

编辑:现在您已经发布了您的代码,很清楚为什么它不起作用 - 正如您所怀疑的那样,您正在尝试将字符串值分配给 DateTime 变量。

DateTime 值没有格式。它们就像数字一样——它们的值不是固有格式的。就像 0x10 和 16 是同一个数字,只是写法不同。

现在听起来您只是想在没有时间的情况下返回日期 - 最好这样做:

return input.AddDays(delta).Date;

Date 属性返回一个 DateTime,其日期相同,但与时间相同。

在旁注中,遗憾的是 .NET 具有如此有限的日期/时间类型集,因此您无法真正代表无时间日期的想法。我正在尝试fix this situation,但它还需要一段时间才能开花结果......

【讨论】:

  • 为了跟进这一点,DateTime 变量没有格式。它们只包含一个表示日期的值。如果您关心格式,请在输出时设置。
  • @Jon 你是 20% 的项目吗……或者你发明了 SkeetBot 来为你发布答案和更新? :-P 我只希望有一天能有这样的效率。
【解决方案2】:

错误是“无法将字符串转换为日期时间”。

这正是这条线试图做的事情:

DateTime monday = String.Format("{d:0}", input.AddDays(delta));

正如我在上面的评论中所说,您在输出时进行格式化。在内部,日期时间只是一个数字,它没有格式的概念。你应该简单地返回input.AddDays(delta)

【讨论】:

    【解决方案3】:

    您收到编译错误,因为您已将 startWeekDate 声明为 DateTime,但 string.Format 返回一个字符串。一种可能的补救措施是更改声明:

    string endWeekDate = string.Format("{d:0}", startWeekDate.Value.AddDays(6));
    

    但是,现在endWeekDate 是一个字符串,因此您可能需要稍微更改代码以使其保持原样,然后引入一个新变量,它是该变量的字符串表示形式。这是否是一个好主意取决于上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2020-06-05
      • 2013-06-15
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      相关资源
      最近更新 更多