【问题标题】:Strip seconds from datetime从日期时间中删除秒数
【发布时间】:2015-10-13 05:21:22
【问题描述】:

我想从 DateTime 中删除/删除秒。从完整的日期时间开始,例如:

DateTime datetime = DateTime.UtcNow;

我想使用任何内置函数或正则表达式去除秒数。

输入:08/02/2015 09:22:45

预期结果:08/02/2015 09:22:00

【问题讨论】:

  • 我希望 08/02/2015 09:22:45 然后只想得到结果 08/02/2015 09:22:00
  • 我已将您在帖子正文中所做的一些评论内联。如有必要,请自行编辑帖子以更新/澄清。

标签: c#


【解决方案1】:

您可以创建一个新的日期实例,并将秒数设置为 0。

DateTime a = DateTime.UtcNow;
DateTime b = new DateTime(a.Year, a.Month, a.Day, a.Hour, a.Minute, 0, a.Kind);

Console.WriteLine(a);
Console.WriteLine(b);

【讨论】:

  • 为了保持一致性,我建议您使用 DateTime.Now 来创建“a”,或者将“DateTimeKind.Utc”添加到创建“b”的行的末尾。创建 UTC 时间而不添加时区可能会导致一些奇怪的结果。
  • 要完成 Patrick 评论,请将 ctor 与 DataTimeKind 一起使用,因此 DateTime b = new DateTime(a.Year, a.Month, a.Day, a.Hour, a.Minute, 0, DateTimeKind.世界标准时间);正如我刚刚编辑的那样
  • 这也不会从结果中删除秒数。它只将它们设置为 0。
【解决方案2】:

并且作为扩展,保留种类并修剪毫秒

public static DateTime TrimSeconds(this DateTime a)
{
    return new DateTime(a.Year, a.Month, a.Day, a.Hour, a.Minute, 0, a.Kind);
}

【讨论】:

  • 这也不会从结果中删除秒数。它只将它们设置为 0。
  • @wEight expexted 结果的原始问题样本中的零点会发生什么?我认为没有人希望他们从 DateTime 中“消失”
【解决方案3】:

从 DateTime 中去除秒和毫秒的简单解决方案:

DateTime dt = DateTime.Now;
DateTime secondsStripped = dt.Date.AddHours(dt.Hour).AddMinutes(dt.Minute);

【讨论】:

    【解决方案4】:

    DateTime 实际上分别存储为DateTimeOfDay。我们可以轻松地重新初始化日期,而无需在 TimeSpan 初始化中包含秒数。这还可以确保删除任何剩余的毫秒数。

    date = date.Date + new TimeSpan(date.TimeOfDay.Hours, date.TimeOfDay.Minutes, 0);
    

    【讨论】:

      【解决方案5】:
      // 2.3 - 0.3 = 2.0
      public static DateTime Floor(this DateTime value, TimeSpan interval) {
          var mod = value.Ticks % interval.Ticks;
          return value.AddTicks( -mod );
      }
      
      // 2.3 - 0.3 + 1 = 3.0
      public static DateTime Ceil(this DateTime value, TimeSpan interval) {
          var mod = value.Ticks % interval.Ticks;
          if (mod != 0) return value.AddTicks( -mod ).Add( interval );
          return value;
      }
      

      【讨论】:

        【解决方案6】:

        要获取本地时间,您可以使用:

        var dt = DateTime.Now;
        dt = dt.AddTicks(-(dt.Ticks % (60 * 10_000_000)));
        

        【讨论】:

          【解决方案7】:

          这个相当优雅的解决方案怎么样?

          new DateTime(DateTime.UtcNow.Ticks / 600000000 * 600000000)
          

          ...这也将剥离任何毫秒/微/纳秒。

          【讨论】:

          • 那里多了一个 0。你的意思是 / 10_000_000。
          • 问题是关于从 DateTime 中删除秒数。但你说的有些不对劲。一分钟有 60 秒,而不是 100 秒;)我确定了答案。顺便说一句:你可能也想更新你的答案,因为它是错误的(不剥夺秒)。此外,对于初级程序员来说,语法错误(下划线)也不是很明显。
          • 好的。因为我没有看到 6,所以我以为您是在尝试去除毫秒数。
          【解决方案8】:
          DateTime time = DateTime.Now;
          string timestring = time.ToString("g");
          

          ToString("g") 会将DateTime 转换为字符串并删除秒数。

          输出:03/29/2018 11:11 PM

          【讨论】:

          • 您必须将其解析回 DateTime,但要符合 OP 获取 DateTime 而不是字符串的请求。
          【解决方案9】:

          你可以的

          DateTime dt = DateTime.Now;
          dt = dt.AddSeconds(-dt.Second);
          

          将秒数设置为 0。

          【讨论】:

          • 小心:这不会从 DateTime 中删除毫秒。
          • 小心:即使你这样做 .AddMilliseconds(-dt.Millisecond) 仍然会剩下几分之一毫秒。
          • 我相信这将删除毫秒(和毫秒的小数部分)。 dt= dt.AddTicks(-(dt.Ticks % TimeSpan.TicksPerSecond));
          猜你喜欢
          • 2017-09-09
          • 1970-01-01
          • 2017-02-09
          • 2015-01-03
          • 1970-01-01
          • 2019-05-25
          • 2019-07-22
          • 1970-01-01
          相关资源
          最近更新 更多