【问题标题】:How to turn DateTime to last day of the month?如何将 DateTime 转换为该月的最后一天?
【发布时间】:2013-08-23 09:02:21
【问题描述】:

如果我有一个DateTime,例如2012-05-24,那么将其转换为该月最后一天的日期的最快方法是什么 (2012-05-31)。

【问题讨论】:

标签: c# .net datetime


【解决方案1】:

你可以使用:

DateTime date = ...;
var endOfMonth = new DateTime(date.Year, date.Month, 
                              DateTime.DaysInMonth(date.Year, date.Month));

请注意,这将创建一个 DateTimeKindUnspecified。您应该考虑您真正想要的Kind。 (或者使用我的 Noda Time 库,您可以使用 LocalDate 代替。)

【讨论】:

  • 你为什么使用var类型而不是DateTime
  • @SubinJacob:看起来很清楚,因为我明确地调用了new DateTime(...)。不过,我会将其更改为 date
  • 我在某处读过它,这就是我问的。 infoq.com/news/2008/05/CSharp-var
  • @SubinJacob:我个人认为TYPE variable = new TYPE(... 是多余的。我希望编译器支持 TYPE variable = new(... 作为 var 的替代品。即使在田间,这也是可行的。当然,为小的语法糖添加大量无意义的语法变体是一个坏主意,所以我的愿望是不被允许的。
【解决方案2】:

这是我使用的一些扩展方法:

public static class DateTimeExtensionMethods
{
    public static DateTime StartOfMonth(this DateTime date)
    {
        return new DateTime(date.Year, date.Month, 1);
    }
    public static DateTime EndOfMonth(this DateTime date)
    {
        return date.StartOfMonth().AddMonths(1).AddSeconds(-1);
    }
}

请注意,在我的例子中,我将它们用于 SQL 查询,所以我希望它一直到该月最后一天的最后一秒。

基于 cmets,是的,如果您只想要日期而不是时间,您可以使用:

    public static DateTime EndOfMonth(this DateTime date)
    {
        return date.StartOfMonth().AddMonths(1).AddDays(-1);
    }

或者只使用结果的Date 属性来获取日期部分,然后根据您的使用方式满足这两种情况。

【讨论】:

  • 那个“月末”将在该月的最后一天晚上 11:59:59,这不是所描述的。诚然,OP 可以使用Date 属性,但是在午夜创建一个新的DateTime 感觉更干净,就像你为StartOfMonth 所做的那样。 (而且可以很容易地直接完成。)
  • 只需将 .AddSeconds(-1) 改为 .AddDays(-1) 即可。
  • @LarsJensen:那时我会删除我的反对票,是的。它仍然不是我的首选解决方案,但至少会更好。 (无论如何删除“一秒”很奇怪 - 这并不代表当天的最后一个 DateTime 值。一个 tick 会更明智,但通常在涉及时间时最好使用无论如何,一个间隔的唯一端点......)
  • @Timoth:目前,您的 SQL 查询将错过最后一秒 内出现的任何值。我会将您的 SQL 更改为 exclusive 结束点,在这种情况下,您只需要下个月的开始。
  • @JonSkeet 它们包含终点,最好的解决方案是简单地提出我的查询
【解决方案3】:

试试这个

DateTime dt = DateTime.Parse("2012-05-24");            
DateTime lastDate = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month));

【讨论】:

    【解决方案4】:

    试试这个

    DateTime date = new DateTime(2012, 05, 24);
    DateTime endOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
    

    输出: 2012 年 5 月 31 日上午 12:00:00

    然后您可以将其修改为您需要的格式。

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      相关资源
      最近更新 更多