【发布时间】:2013-08-23 09:02:21
【问题描述】:
如果我有一个DateTime,例如2012-05-24,那么将其转换为该月最后一天的日期的最快方法是什么 (2012-05-31)。
【问题讨论】:
-
这个问题已经可以讨论了。**[ref][1]** [1]: stackoverflow.com/questions/2493032/…
如果我有一个DateTime,例如2012-05-24,那么将其转换为该月最后一天的日期的最快方法是什么 (2012-05-31)。
【问题讨论】:
你可以使用:
DateTime date = ...;
var endOfMonth = new DateTime(date.Year, date.Month,
DateTime.DaysInMonth(date.Year, date.Month));
请注意,这将创建一个 DateTime 和 Kind 的 Unspecified。您应该考虑您真正想要的Kind。 (或者使用我的 Noda Time 库,您可以使用 LocalDate 代替。)
【讨论】:
var类型而不是DateTime?
new DateTime(...)。不过,我会将其更改为 date。
TYPE variable = new TYPE(... 是多余的。我希望编译器支持 TYPE variable = new(... 作为 var 的替代品。即使在田间,这也是可行的。当然,为小的语法糖添加大量无意义的语法变体是一个坏主意,所以我的愿望是不被允许的。
这是我使用的一些扩展方法:
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 属性来获取日期部分,然后根据您的使用方式满足这两种情况。
【讨论】:
Date 属性,但是在午夜创建一个新的DateTime 感觉更干净,就像你为StartOfMonth 所做的那样。 (而且可以很容易地直接完成。)
DateTime 值。一个 tick 会更明智,但通常在涉及时间时最好使用无论如何,一个间隔的唯一端点......)
试试这个
DateTime dt = DateTime.Parse("2012-05-24");
DateTime lastDate = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month));
【讨论】:
试试这个
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
然后您可以将其修改为您需要的格式。
【讨论】: