【问题标题】:DateTime convert to Date and then back to DateTime in C#DateTime 在 C# 中转换为 Date 然后返回 DateTime
【发布时间】:2010-03-05 14:40:10
【问题描述】:

我使用它来将 DateTime 值转换为 Date,然后添加 00:00:00 和 23:59:59 以确保在计算内容时考虑到全天。我很确定这是错误的做事方式。正确的方法是什么?

        DateTime varObliczOd = DateTime.Parse(dateTimeWycenaPortfelaObliczDataOd.Value.ToShortDateString() + " 00:00:00");
        DateTime varObliczDo = DateTime.Parse(dateTimeWycenaPortfelaObliczDataDo.Value.ToShortDateString() + " 23:59:59");

【问题讨论】:

  • 你能解释一下这个使用的上下文吗
  • 你想用这些日期做什么。如果您只是不想要那里的实时时间,您可以执行 dateTimeVar.Date ,它会在最后为您提供 12:00 AM 的日期,您可以使用 dateTimeVar.Date.AddDays(1) 获得一天的结束.AddSeconds(-1)
  • 我正在使用它来向 Sql 数据库提供此日期。重要的是它可以在 00 到 23:59 之间获取所有交易(虽然它们只在 8 到 18 点工作,但我更愿意花一整天时间)
  • 特别是有时 00:00:00 用于写入系统而不是人进行的交易。

标签: c# .net datetime date datetimepicker


【解决方案1】:

如果dateTimeWycenaPortfelaObliczDataOdDateTime 类型,您可以使用:

dateTimeWycenaPortfelaObliczDataOd.Date

仅获取日期部分(时间为 00:00:00...)。 如果您想获取日期的最后一个刻度,可以使用:

dateTimeWycenaPortfelaObliczDataOd.Date.AddDays(1).AddTicks(-1)

但您确实最好使用下一个日期 (.AddDays(1))。

在任何情况下,都不需要转换成字符串再转换回DateTime。

【讨论】:

  • 太好了,我不能使用 .AddDays(1) 只是因为它会考虑第二天的交易(有些东西是在 00:00:00 完成的数据库中写入的)
  • 我的意思是,如果您使用日期进行范围检查,您可以提取所有时间戳符合的加工记录: StartOfTomorrow > timestamp >= startOfToday 。使用一天中的最后一个滴答声也应该很有效,只是闻起来很臭。
  • 没错,我应该使用时间戳
【解决方案2】:

DateTime 对象有一个 Date 属性,这可能是您需要的。

【讨论】:

    【解决方案3】:

    您可以在 DateTime 对象上使用以下属性/方法来获取您的值:

    DateTime varObliczOd = dateTimeWycenaPortfelaObliczDataOd.Date;
    DateTime varObliczDo = dateTimeWycenaPortfelaObliczDataOd.AddDayes(1).AddTicks(-1);
    

    【讨论】:

      【解决方案4】:

      了解您为什么需要它会有所帮助,但这会奏效。

      DateTime varObliczOd = dateTimeWycenaPortfelaObliczDataOd.Date;
      DateTime varObliczDo = varObliczOd.AddDays(1).AddSeconds(-1);
      

      使用Date 属性,然后直接操作它们以创建所需的时间组件——无需费心解析和转换。

      【讨论】:

        【解决方案5】:

        您可以使用 DateTime 对象的 Date 属性来完成您需要的操作。

        DateTime varObliczOd = dateTimeWycenaPortfelaObliczDataOd.Value.Date;
        DateTime varObliczDo = dateTimeWycenaPortfelaObliczDataDo.Value.Date.AddDays(1);
        

        如果你真的希望它在 23:59:59 结束,你可以这样做:

        DateTime varObliczDo = dateTimeWycenaPortfelaObliczDataDo.Value.Date.AddDays(1).AddSeconds(-1);
        

        将 varObliczDo 设置为您的结束日期,没有时间加一天(午夜)。因此,如果 dateTimeWycenaPortfelaObliczDataDo2010-03-05 16:12:12 它现在将是 2010-03-06 00:00:00

        【讨论】:

          【解决方案6】:

          可能是这样的?这是我脑子里乱写的,可能代码有错误。

          DateTime varObliczOd = dateTimeWycenaPortfelaObliczDataOd.AddSeconds(-dateTimeWycenaPortfelaObliczDataOd.Seconds).AddMinutes(-dateTimeWycenaPortfelaObliczDataOd.Minutes).AddHours(-dateTimeWycenaPortfelaObliczDataOd.Hours);
          
          DateTime varObliczDo  = new DateTime(dateTimeWycenaPortfelaObliczDataDo.Year, dateTimeWycenaPortfelaObliczDataDo.Month, dateTimeWycenaPortfelaObliczDataDoDay, 23, 59, 59);
          

          【讨论】:

            【解决方案7】:

            DateTime newDate = new DateTime(oldDate.Year, oldDate.Month, oldDate.Day, 23, 59,59) DateTime newDate = new DateTime(oldDate.Year, oldDate.Month, oldDate.Day, 0, 0, 0)

            【讨论】:

              【解决方案8】:

              您可以使用 TimeSpan:

              DateTime varObliczOd = dateTimeWycenaPortfelaObliczDataOd - new TimeSpan(dateTimeWycenaPortfelaObliczDataOd.Hours, dateTimeWycenaPortfelaObliczDataOd.Minutes, dateTimeWycenaPortfelaObliczDataOd.Seconds);
              

              这样您至少可以避免解析,根据当地文化设置,解析可能会失败。

              【讨论】:

              • 是的,它在一个工作站上失败了,我知道会这样。我使用了公认的解决方案,因为它看起来更好。
              • 您采用哪种解决方案是一个偏好问题,您接受的解决方案在代码中很容易阅读,但它使用多个操作来计算结果,而我只使用一个。当然,这一操作的背后究竟是什么我也不能告诉你^^
              猜你喜欢
              • 2018-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-24
              • 2016-04-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多