【问题标题】:set DateTime to start of month将 DateTime 设置为月初
【发布时间】:2011-06-27 12:24:03
【问题描述】:

如何在 C# 中将 DateTime 设置为每月的第一天?

【问题讨论】:

  • 当月的月初?
  • 那该怎么办呢,..每个月的日期都以 1 开头..他想知道月初的那一天
  • 如果我们在一月,它应该显示 01-Jan-2011 和二月,然后是 01-Feb-2011
  • 你可以查看this

标签: c#


【解决方案1】:
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);

【讨论】:

  • 小贴士:始终将DateTime.Now 放入变量中,如果要重复使用该值,请使用该变量。如果这段代码恰好在午夜左右执行,那么出错的可能性很小;对DateTime.Now 的两次调用可能发生在午夜的每一边,可能会产生奇怪的影响。
  • 好点。我认为新年前夜的午夜是这可能会导致问题的时间。
  • 不只是新年。在任何一个月的最后一天的午夜都会有问题。无论如何,如果它在月底午夜的那一纳秒执行,那只会是一个问题。但是既然你已经修复了你的代码,现在一切都好了。
  • 你为什么使用“var”而不是“DateTime”?
  • @markthewizard1234 主要是因为 C# 程序员很懒惰。所以我们尽可能使用 var,因为它只有三个字符。还有其他原因,但我觉得这是大多数人这样做的主要原因。
【解决方案2】:

这样的事情会起作用

DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);

【讨论】:

  • 正如 Fredrik Mork 对 Nick Jones 的回答所评论的那样,当您多次使用 Datetime 时,最好将它存储在一个变量中,以保证该月最后一天午夜前后没有问题。所以:今天的日期时间 = 日期时间。今天; DateTime firstDay = today.AddDays(1-today.Day);
【解决方案3】:
public static DateTime FirstDayOfMonth(this DateTime current)
{
    return current.AddDays(1 - current.Day);
}

【讨论】:

  • 这样更好,因为它保留了时区。
【解决方案4】:

聚会有点晚了,但这是一个对我有用的扩展方法

public static class DateTimeExtensions
{
  public static DateTime FirstDayOfMonth(this DateTime dt)
  {
    return new DateTime(dt.Year, dt.Month, 1);
  }
}

【讨论】:

  • 这样做的问题是它没有保持原来的时区。
【解决方案5】:
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);

您可以使用其他任何东西来代替 DateTime.Now

【讨论】:

    【解决方案6】:

    我刚刚创建了一些基于 Nick 答案的扩展方法和 SO 上的其他方法

    public static class DateTimeExtensions 
    {
        /// <summary>
        /// get the datetime of the start of the week
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="startOfWeek"></param>
        /// <returns></returns>
        /// <example>
        /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
        /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
        /// </example>
        /// <remarks>http://stackoverflow.com/a/38064/428061</remarks>
        public static System.DateTime StartOfWeek(this System.DateTime dt, DayOfWeek startOfWeek)
        {
            var diff = dt.DayOfWeek - startOfWeek;
            if (diff < 0)
                diff += 7;
    
            return dt.AddDays(-1 * diff).Date;
        }
    
        /// <summary>
        /// get the datetime of the start of the month
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        /// <remarks>http://stackoverflow.com/a/5002582/428061</remarks>
        public static System.DateTime StartOfMonth(this System.DateTime dt) =>
            new System.DateTime(dt.Year, dt.Month, 1);
    
    
        /// <summary>
        /// get datetime of the start of the year
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static System.DateTime StartOfYear(this System.DateTime dt) => 
             new System.DateTime(dt.Year, 1, 1);
    
    }
    

    【讨论】:

      【解决方案7】:

      这应该是有效且正确的:

      DateTime RoundDateTimeToMonth(DateTime time)
      {
          long ticks = time.Ticks;
          return new DateTime((ticks / TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind);
      }
      

      这里ticks / TimeSpan.TicksPerDay 返回到给定time 的全天计数,- time.Day + 1 将此计数重置为月初。

      【讨论】:

        【解决方案8】:

        希望对你有所帮助。

        textbox1.Text = "01-" + DateTime.Now.ToString("MMM-yyyy");

        【讨论】:

          【解决方案9】:
          var currentDate = DateTime.UtcNow.Date;
          var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));
          

          【讨论】:

          • 这完全是 fubo 的答案的重复,你不觉得吗?
          • 尽管此代码可能会解决问题,但始终鼓励添加解释说明其工作原理/方式的说明。
          • @ThomasAyoub - 不,这不是 fubo 答案的完全重复,因为它不包含时间部分。
          • @BDL - 我认为这很容易理解,不需要解释。但仅供参考,我采用了当前的 Utc 日期,然后从中减去(当前日期的天数 - 1)以获得月份的开始日期,即 1(不是 0,这就是我减去 1 的原因)。是的,这肯定会解决问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-13
          • 2019-04-24
          • 2014-05-10
          • 2023-04-02
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多