【问题标题】:C# DateTime and String value condition checkC# DateTime 和 String 值条件检查
【发布时间】:2021-12-12 16:48:08
【问题描述】:

我有问题。

这不行

> var from = "";
> StartDTime = Convert.ToDateTime(from);

这是有效的

> var from = "2021-10-05";
> StartDTime = Convert.ToDateTime(from);

有时我发送日期值,但有时不发送日期值。在那个时候from 变量作为空字符串传递。我想设置 if from variable is = "" 然后需要设置默认日期值。那么我该如何解决这个问题?请帮帮我。谢谢

【问题讨论】:

  • 你试过DateTime.TryParse吗?
  • 试试DateTime StartDTime = DateTime.TryParse(from, out StartDTime) ? StartDTime : DateTime.Now;
  • fromcontextual keyword。完全避免关键字作为变量名可能是一个好主意,但考虑到上下文,它会编译。

标签: c# asp.net .net asp.net-mvc .net-core


【解决方案1】:

这样做的安全方法是:

StartDTime = string.IsNullOrEmpty(from) ? DateTime.Now : DateTime.Parse(from);

但是,如果您可以控制传递“from”变量的代码,则可以将其声明为可为空的 DateTime,那么您的代码将如下所示:

DateTime? from = null;
var StartDTime = from.HasValue ? from.Value : DateTime.Now;

简称:

StartDTime = from ?? DateTime.Now;

【讨论】:

  • 如果from 不是可以解析为日期的字符串会发生什么情况?例如代码中的from = "abcd";
  • @VDWWD 会出错,我不喜欢 Wilson 的解决方案
  • 问题的前提是“from”变量是空字符串或日期值。除非开发人员考虑其他可能的值......更多的代码只会污染代码库。
  • 没错,但最好还是选择更安全的代码。
【解决方案2】:

DateTime.TryParse 将为您完成这项工作: 例如:

    DateTime dateTime;
    var from = ""; 
    DateTime.TryParse(from, out dateTime);

【讨论】:

    【解决方案3】:

    单行,只有您指定的验证:

    StartDTime = from == "" ? new DateTime() : Convert.ToDateTime(from);
    

    【讨论】:

    • 如果from 不是可以解析为日期的字符串会发生什么情况?例如代码中的from = "abcd";
    • 好吧,可能会抛出一个不太理想的异常。因此我的笔记,only 验证发问者指定。
    【解决方案4】:

    它并不优雅,但很有效。

    var from = "";
    if(from == ""){ from = DateTime.MinValue.ToString(); }
    DateTime StartDTime = Convert.ToDateTime(from);
    

    但我认为可以为空的 DateTime 会更优雅,如下所示:

    var from = null;
    DateTime? StartDTime = from;
    

    或者您可以设置默认日期,如下所示:

    var from = null;
    DateTime? StartDTime = from ?? YourDefaultDate;
    

    【讨论】:

    • 感谢您的支持
    【解决方案5】:

    Convert 方法要么成功转换传递给它的字符串,要么抛出错误,这就是它应该工作的方式。对于大多数数据类型,还有TryParse 方法根据转换是否成功返回真/假,如果转换失败,则输出变量将为DateTime.MinValue。我会这样处理你的情况:

    DateTime startDTime;
    string from = "";
    if (!DateTime.TryParse(from, out startDTime)){
        startDTime = DateTime.Now;
    }
    

    这会将 startTime 设置为传入的日期,但如果没有传递任何日期,则将其设置为当前日期和时间 - 如果您想要一个不同的默认值,则替换 new DateTime() 并且如果您的默认值应该是0001 年 1 月 1 日,那么您可以直接使用 TryParse 部分,因为这是失败的 TryParse 的自动默认值。

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多