【问题标题】:Trying to get an int by subtracting a date from a date试图通过从日期中减去日期来获得 int
【发布时间】:2012-07-23 18:53:26
【问题描述】:

使用此代码:

public static bool PlatypusIsAFornightOrLessOld(int PlatypusID) {
const int FORTNIGHT = 14;
const string sql = @"SELECT PLATYPUSBIRTHDATE
            FROM PLATYPI 
            WHERE PLATYPUSID = :PLATYPUSID";
DateTime dt;
try {
    using (var ocmd = new OracleCommand(sql, oc)) {
        ocmd.Parameters.Add("PLATYPUSID", PlatypusID);
        dt = Convert.ToDateTime(ocmd.ExecuteScalar());
    }
    return (DateTime.Today - dt) <= FORTNIGHT;
} catch (Exception e) {
. . .

我得到:“返回”行上的“运算符 '

【问题讨论】:

  • 顺便说一句,两周是 14 天...
  • 啊,是的,我在想什么(两周 == 14,!20)
  • 哦,我把它和几天的“分数”混在一起了。
  • 接受的改变伤害了人……只是伤害……
  • @JT:对不起,没有私人的!

标签: c# datetime date


【解决方案1】:

你需要做的

return (DateTime.Today - dt).Days <= FORTNIGHT;

Days 返回时间跨度的完整天数。如果您需要小数天数,您可以使用 TotalDays。

【讨论】:

    【解决方案2】:

    其他人建议 TimeSpan 到天数。我建议将FORTNIGHT 也表示为TimeSpan 会更简洁。或者,更好的是:将 deadline 计算为 DateTime 并完全避免减法:

    public static bool PlatypusIsAFornightOrLessOld(int platypusId) {
        DateTime oneFortnightAgo = DateTime.Today.AddDays(-14);
    
        ... SQL stuff ...
    
        return dt >= oneFortnightAgo;
    }
    

    另外,我希望你没有真的在你的真实代码中得到catch(Exception e)。您几乎应该永远捕获Exception - 并且绝对不能使用执行 SQL 操作的相同方法。

    【讨论】:

    • 我的代码中有很多 catch(Exception e)。为什么这很糟糕,尤其是在 SQL 操作中?有趣的是,Resharper 没有抱怨它。我不是怀疑你,乔恩,只是好奇!
    • 顺便说一句,我知道你的意思,但它实际上是 AddDays()
    • @ClayShannon:哎呀 - PlusDays 是我们在 Noda Time 中得到的,我认为它更干净,因为它更明显地返回了操作的结果,而不是改变现有的值:) 捕获Exception 通常很糟糕,因为它声称可以处理出现问题的任何事情 - 即使这是您真的没想到并且不想尝试处理的东西。通常只有“顶级”调用应该处理异常(例如,中止请求但保持服务器活动) - 而不是执行实际 SQL 工作的业务调用。
    • 捕获异常 e 只是为了记录和重新抛出呢?这是我通常做的(使用 log4net): log.Error(e, e);扔;
    • @ClayShannon:是的,这还不错——除了把地方弄得乱七八糟。 (你为什么不在顶层做那个?)
    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多