我如何获得一个月的最后一天?

Posted

技术标签:

【中文标题】我如何获得一个月的最后一天?【英文标题】:How do I get the last day of a month? 【发布时间】:2011-01-30 09:14:31 【问题描述】:

如何在 C# 中找到一个月的最后一天?

例如,如果我的日期是 03/08/1980,如何获得第 8 个月的最后一天(在本例中为 31)?

【问题讨论】:

@Mark:我能问什么?我认为您自己的答案不需要扩展方法。 最后一天不仅仅特定于月份,还需要年份。 2010 年 2 月的最后一天是 28 日,但 2008 年 2 月的最后一天是 29 日。 @abatishchev 它不需要扩展方法,但问题并没有真正要求它。但是,至少对我来说,看到它会更好,更具可读性。扩展方法更多的是一种建议。任何解决方案都可以在扩展方法中工作,而不仅仅是我的。 【参考方案1】:

你得到这样的一个月的最后一天,它返回 31:

DateTime.DaysInMonth(1980, 08);

【讨论】:

public static DateTime ConvertToLastDayOfMonth(DateTime date) return new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month)); 以日期格式获取该月的最后一天 超级好用:-) 或“new DateTime(1980,8,3).AddMonths(1).AddDays(-3);”。 (-3) 是天数,所以下个月的 0 基本上是当月的最后一天。【参考方案2】:
var lastDayOfMonth = DateTime.DaysInMonth(date.Year, date.Month);

【讨论】:

@Henk 实际上,我从源代码中的某个位置提取了这个,该位置从lastDayOfMonth 创建了DateTime。老实说,无论哪种方式都非常有效。这是一个迂腐的论点,哪种方式更好。我两种方法都做了,都得到了相同的答案。【参考方案3】:

如果你想要 日期,给定一个月和一年,这似乎是正确的:

public static DateTime GetLastDayOfMonth(this DateTime dateTime)

    return new DateTime(dateTime.Year, dateTime.Month, DateTime.DaysInMonth(dateTime.Year, dateTime.Month));

【讨论】:

【参考方案4】:

从下个月的第一天减去一天:

DateTime lastDay = new DateTime(MyDate.Year,MyDate.Month+1,1).AddDays(-1);

另外,如果您也需要它在 12 月工作:

DateTime lastDay = new DateTime(MyDate.Year,MyDate.Month,1).AddMonths(1).AddDays(-1);

【讨论】:

你的第二行代码很好,你应该删除第一行以避免混淆。【参考方案5】:

您可以通过此代码找到任何月份的最后日期:

var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year, now.Month, 1);
var DaysInMonth = DateTime.DaysInMonth(now.Year, now.Month);
var lastDay = new DateTime(now.Year, now.Month, DaysInMonth);

【讨论】:

【参考方案6】:
// Use any date you want, for the purpose of this example we use 1980-08-03.
var myDate = new DateTime(1980,8,3);
var lastDayOfMonth = new DateTime(myDate.Year, myDate.Month, DateTime.DaysInMonth(myDate.Year, myDate.Month));

【讨论】:

此答案仅响应提问者的示例。更全面的答案会更有帮助。 您可以使用任何您想要的日期作为输入值,因此您可以将此解决方案应用于您想要的任何日期。 某些日期会失败,请尝试var myDate = new DateTime(1980, 1, 31);(返回 29 日) Hans Kesting,你是对的。如果下个月的天数少于当前天数,此方法将失败。我想最简单的方法是使用 DateTime.DaysInMonth() 但这是公认的答案,所以我的答案应该被删除。【参考方案7】:

你可以通过一行代码找到一个月的最后一天:

int maxdt = (new DateTime(dtfrom.Year, dtfrom.Month, 1).AddMonths(1).AddDays(-1)).Day;

【讨论】:

我很奇怪,不是简单的方法:DateTime.DaysInMonth,为什么有人要寻找这种不可读且复杂的方法来实现它!? - 但作为一个有效的解决方案是可以接受的;)。【参考方案8】:

来自DateTimePicker:

第一次约会:

DateTime first_date = new DateTime(DateTimePicker.Value.Year, DateTimePicker.Value.Month, 1);

最后日期:

DateTime last_date = new DateTime(DateTimePicker.Value.Year, DateTimePicker.Value.Month, DateTime.DaysInMonth(DateTimePicker.Value.Year, DateTimePicker.Value.Month));

【讨论】:

【参考方案9】:

您可以按如下方式扩展 DateTime;

public static class DateTimeMethods
    
        public static DateTime StartOfMonth(this DateTime date)
        
            return new DateTime(date.Year, date.Month, 1, 0, 0, 0);
        

        public static DateTime EndOfMonth(this DateTime date)
        
            return date.StartOfMonth().AddMonths(1).AddSeconds(-1);
        
    

并按如下方式使用;

DateTime today = DateTime.Now;

DateTime startOfMonth = today.StartOfMonth();
DateTime endOfMonth = today.EndOfMonth();

【讨论】:

【参考方案10】:

在特定日历中获取一个月的最后一天 - 并在扩展方法中 - :

public static int DaysInMonthBy(this DateTime src, Calendar calendar)

    var year = calendar.GetYear(src);                   // year of src in your calendar
    var month = calendar.GetMonth(src);                 // month of src in your calendar
    var lastDay = calendar.GetDaysInMonth(year, month); // days in month means last day of that month in your calendar
    return lastDay;

【讨论】:

【参考方案11】:

这将显示下个月的最后一个日期。您可以通过从 AddMonths(x) 中添加或减去它来添加要返回的一年中的月份

DateTime.Now.AddMonths(2).AddDays(-DateTime.Now.Day)

【讨论】:

【参考方案12】:

2021 年 5 月 7 日示例

DateTime.Now.Day;

结果:5

DateTime.Now.AddMonths(+1).AddDays(-DateTime.Now.Day).ToString("yyyy-MM-dd");

结果:2021/07/31

【讨论】:

【参考方案13】:

这个公式反映了@RHSeeger 的想法,它是获取(在本例中)第 3 个月的最后一天(单元格 A1 + 4 中的日期月份,该月的第一天减去 1 天)的简单解决方案:

=DATE(YEAR(A1);MONTH(A1)+4;1)-1

非常精确,包括闰年的二月:)

【讨论】:

【参考方案14】:

另一种获取结束日期的方法:

    private static DateTime GetMonthEndDate(DateTime date)
    
        DateTime endDate = date;
        int endDateMonth = endDate.Month;

        while (endDateMonth == endDate.Month)
            endDate = endDate.AddDays(1);

        endDate = endDate.AddDays(-1);

        return endDate;
    

【讨论】:

【参考方案15】:

我只想在每个月的最后一天触发代码,就这么简单......

if (DateTime.UtcNow.AddDays(1).Day != 1)

    // Tomorrow is not the first...
    return;

【讨论】:

【参考方案16】:

我不懂 C#,但如果发现没有方便的 API 方法来获取它,那么您可以这样做的一种方法是遵循以下逻辑:

today -> +1 month -> set day of month to 1 -> -1 day

当然,这假设你有这种类型的日期数学。

【讨论】:

这不准确。 实际上在许多语言中获取一个月的最后一天是准确的逻辑,包括 c# "new DateTime(1980,8,1).AddMonths(1).AddDays(-1);"像这样基本。

以上是关于我如何获得一个月的最后一天?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得一个月的最后一天?

python怎么获得每个月的第一天和最后一天

问与答:我如何知道一个月的最后一天是哪一天?

Javascript / jQuery:如何检查日期是不是是一个月的最后一天

如何从日期找到一个月的最后一天?

js代码实现,如何获取当前月份的最后一天