如何显示可为 null 的 DateTime 类型的字符串表示形式?
How can I show a string representation of a nullable DateTime type?
用户提供 "from" 和 "to" 个月来生成报告(例如,从 1 个月前到 13 个月前;如果他们在 2/15/2016 选择此项,则return 值为 1/1/2015 和 1/1/2016)。
我想允许用户 select 距 "from" 或 "to" 组合框最远或最近的月份。我只想使用时间最远的 "from" 和时间最近的 "to" 以避免他们混淆(他们可以做任何对他们来说很自然的事情)。
所以我从这段代码开始:
int fromMonths = Convert.ToInt32(comboBoxProduceUsageFrom.Text);
DateTime RptParamsNominalFromDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(fromMonths, nextGenerateAndSendDate);
int toMonths = Convert.ToInt32(comboBoxProduceUsageTo.Text);
DateTime RptParamsNominalToDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(toMonths, nextGenerateAndSendDate);
..然后我想将 "from" 日期设置为最远的时间,将 "to" 设置为更近的时间。我第一次尝试这个:
DateTime RptParamsFromDate;
DateTime RptParamsToDate;
if (RptParamsNominalFromDate > RptParamsNominalToDate)
{
RptParamsFromDate = RptParamsNominalToDate;
RptParamsToDate = RptParamsNominalFromDate;
}
else if (RptParamsNominalToDate > RptParamsNominalFromDate)
{
RptParamsFromDate = RptParamsNominalFromDate;
RptParamsToDate = RptParamsNominalToDate;
}
...但是失败了,“使用未分配的局部变量 'RptParamsFromDate'”(以及 "RptParamsToDate" 的相同错误)。
所以我试着给 DateTimes 一个 value/nonvalue 像这样:
DateTime RptParamsFromDate = null;
DateTime RptParamsToDate = null;
...但这给了我,“无法将 null 转换为 'System.DateTime',因为它是不可为 null 的值类型”
所以我再次动了动手指并尝试使 DateTimes 为空:
DateTime? RptParamsFromDate = null;
DateTime? RptParamsToDate = null;
...但后来我得到,“'System.Nullable' 不包含 'ToLongDateString' 的定义并且没有扩展方法 'ToLongDateString' 接受类型的第一个参数'System.Nullable' 可以找到(您是否缺少 using 指令或程序集引用?)"
这是由于这段代码:
RptParamsFromDate.ToLongDateString()
在此区块中:
MessageBox.Show(string.Format(
"Using the current configuration, the Produce Usage report would next be sent on {0} and emailed to {1}; the report would cover data from {2} to {3}",
nextGenerateAndSendDate.ToLongDateString(),
emailRecipients,
RptParamsFromDate.ToLongDateString(),
RptParamsToDate.ToLongDateString()));
那么我该怎么做才能显示 DateTime 值并仍然安抚脾气暴躁的野兽?
更新
结合来自 SLaks 和 crashmstr 的信息,我最终得到了以下工作方法:
private void buttonTestProdUsageSettings_Click(object sender, EventArgs e)
{
// Show example of when the report will run, and using which parameters,
// using the current configuration
DateTime nextGenerateAndSendDate = GetNextProduceUsageGenerateAndSendDate();
string emailRecipients = string.Join(",", emailAddresses.ToArray());
int fromMonths = Convert.ToInt32(comboBoxProduceUsageFrom.Text);
DateTime RptParamsNominalFromDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(fromMonths, nextGenerateAndSendDate);
int toMonths = Convert.ToInt32(comboBoxProduceUsageTo.Text);
DateTime RptParamsNominalToDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(toMonths, nextGenerateAndSendDate);
if (RptParamsNominalFromDate.Equals(RptParamsNominalToDate))
{
MessageBox.Show("The \"from\" and \"to\" values must differ; please try again.");
return;
}
// Allow user to enter either the nearest or furthest value in either the "from" or the "to":
DateTime? RptParamsFromDate = null;
DateTime? RptParamsToDate = null;
if (RptParamsNominalFromDate > RptParamsNominalToDate)
{
RptParamsFromDate = RptParamsNominalToDate;
RptParamsToDate = RptParamsNominalFromDate;
}
else if (RptParamsNominalToDate > RptParamsNominalFromDate)
{
RptParamsFromDate = RptParamsNominalFromDate;
RptParamsToDate = RptParamsNominalToDate;
}
MessageBox.Show(string.Format(
"Using the current configuration, the Produce Usage report would next be sent on {0} and emailed to {1}; the report would cover data from {2} to {3}",
nextGenerateAndSendDate.ToLongDateString(),
emailRecipients,
RptParamsFromDate.HasValue ? RptParamsFromDate.Value.ToLongDateString() : "No \"from\" Date",
RptParamsToDate.HasValue ? RptParamsToDate.Value.ToLongDateString() : "No \"to\" Date"));
}
您正在尝试使用可空类型的值。
为此,您需要访问其 .Value
属性,其中 returns 是一个常规 DateTime
值。
请注意,如果它实际上为 null,则会引发异常。
为了补充 Slaks 的原始答案,您得到第一个答案的原因是因为您必须在代码的后面尝试引用 RptParamsFromDate
或其同类。问题是因为:
您已完成:
- 创建变量
- 是真的吗?不? ...好的
- 还有其他事情是真的吗?不? ...好的
- 变量还没有被设置为任何东西。 (因为
RptParamsNominalFromDate == RptParamsNominalToDate
)
- (假设)您已尝试访问该变量。
Use of unassigned local variable 'RptParamsFromDate'”(以及“RptParamsToDate
的相同错误
将其设置为 DateTime?
会在一定程度上解决这个问题,但您首先需要研究逻辑问题。请确保在稍后尝试使用它之前检查它是否为 null。
用户提供 "from" 和 "to" 个月来生成报告(例如,从 1 个月前到 13 个月前;如果他们在 2/15/2016 选择此项,则return 值为 1/1/2015 和 1/1/2016)。
我想允许用户 select 距 "from" 或 "to" 组合框最远或最近的月份。我只想使用时间最远的 "from" 和时间最近的 "to" 以避免他们混淆(他们可以做任何对他们来说很自然的事情)。
所以我从这段代码开始:
int fromMonths = Convert.ToInt32(comboBoxProduceUsageFrom.Text);
DateTime RptParamsNominalFromDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(fromMonths, nextGenerateAndSendDate);
int toMonths = Convert.ToInt32(comboBoxProduceUsageTo.Text);
DateTime RptParamsNominalToDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(toMonths, nextGenerateAndSendDate);
..然后我想将 "from" 日期设置为最远的时间,将 "to" 设置为更近的时间。我第一次尝试这个:
DateTime RptParamsFromDate;
DateTime RptParamsToDate;
if (RptParamsNominalFromDate > RptParamsNominalToDate)
{
RptParamsFromDate = RptParamsNominalToDate;
RptParamsToDate = RptParamsNominalFromDate;
}
else if (RptParamsNominalToDate > RptParamsNominalFromDate)
{
RptParamsFromDate = RptParamsNominalFromDate;
RptParamsToDate = RptParamsNominalToDate;
}
...但是失败了,“使用未分配的局部变量 'RptParamsFromDate'”(以及 "RptParamsToDate" 的相同错误)。
所以我试着给 DateTimes 一个 value/nonvalue 像这样:
DateTime RptParamsFromDate = null;
DateTime RptParamsToDate = null;
...但这给了我,“无法将 null 转换为 'System.DateTime',因为它是不可为 null 的值类型”
所以我再次动了动手指并尝试使 DateTimes 为空:
DateTime? RptParamsFromDate = null;
DateTime? RptParamsToDate = null;
...但后来我得到,“'System.Nullable' 不包含 'ToLongDateString' 的定义并且没有扩展方法 'ToLongDateString' 接受类型的第一个参数'System.Nullable' 可以找到(您是否缺少 using 指令或程序集引用?)"
这是由于这段代码:
RptParamsFromDate.ToLongDateString()
在此区块中:
MessageBox.Show(string.Format(
"Using the current configuration, the Produce Usage report would next be sent on {0} and emailed to {1}; the report would cover data from {2} to {3}",
nextGenerateAndSendDate.ToLongDateString(),
emailRecipients,
RptParamsFromDate.ToLongDateString(),
RptParamsToDate.ToLongDateString()));
那么我该怎么做才能显示 DateTime 值并仍然安抚脾气暴躁的野兽?
更新
结合来自 SLaks 和 crashmstr 的信息,我最终得到了以下工作方法:
private void buttonTestProdUsageSettings_Click(object sender, EventArgs e)
{
// Show example of when the report will run, and using which parameters,
// using the current configuration
DateTime nextGenerateAndSendDate = GetNextProduceUsageGenerateAndSendDate();
string emailRecipients = string.Join(",", emailAddresses.ToArray());
int fromMonths = Convert.ToInt32(comboBoxProduceUsageFrom.Text);
DateTime RptParamsNominalFromDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(fromMonths, nextGenerateAndSendDate);
int toMonths = Convert.ToInt32(comboBoxProduceUsageTo.Text);
DateTime RptParamsNominalToDate = ReportSchedulerConstsAndUtils.SubtractMonthsFrom(toMonths, nextGenerateAndSendDate);
if (RptParamsNominalFromDate.Equals(RptParamsNominalToDate))
{
MessageBox.Show("The \"from\" and \"to\" values must differ; please try again.");
return;
}
// Allow user to enter either the nearest or furthest value in either the "from" or the "to":
DateTime? RptParamsFromDate = null;
DateTime? RptParamsToDate = null;
if (RptParamsNominalFromDate > RptParamsNominalToDate)
{
RptParamsFromDate = RptParamsNominalToDate;
RptParamsToDate = RptParamsNominalFromDate;
}
else if (RptParamsNominalToDate > RptParamsNominalFromDate)
{
RptParamsFromDate = RptParamsNominalFromDate;
RptParamsToDate = RptParamsNominalToDate;
}
MessageBox.Show(string.Format(
"Using the current configuration, the Produce Usage report would next be sent on {0} and emailed to {1}; the report would cover data from {2} to {3}",
nextGenerateAndSendDate.ToLongDateString(),
emailRecipients,
RptParamsFromDate.HasValue ? RptParamsFromDate.Value.ToLongDateString() : "No \"from\" Date",
RptParamsToDate.HasValue ? RptParamsToDate.Value.ToLongDateString() : "No \"to\" Date"));
}
您正在尝试使用可空类型的值。
为此,您需要访问其 .Value
属性,其中 returns 是一个常规 DateTime
值。
请注意,如果它实际上为 null,则会引发异常。
为了补充 Slaks 的原始答案,您得到第一个答案的原因是因为您必须在代码的后面尝试引用 RptParamsFromDate
或其同类。问题是因为:
您已完成:
- 创建变量
- 是真的吗?不? ...好的
- 还有其他事情是真的吗?不? ...好的
- 变量还没有被设置为任何东西。 (因为
RptParamsNominalFromDate == RptParamsNominalToDate
) - (假设)您已尝试访问该变量。
Use of unassigned local variable 'RptParamsFromDate'”(以及“RptParamsToDate
的相同错误将其设置为 DateTime?
会在一定程度上解决这个问题,但您首先需要研究逻辑问题。请确保在稍后尝试使用它之前检查它是否为 null。