Làm thế nào để tôi có được ngày cuối cùng của một tháng?


325

Làm cách nào tôi có thể tìm thấy ngày cuối cùng của tháng trong C #?

Ví dụ: nếu tôi có ngày 03/08/1980, làm thế nào để tôi có được ngày cuối cùng của tháng 8 (trong trường hợp này là 31)?


2
@Mark: Tôi có thể hỏi gì? Câu trả lời của riêng bạn không yêu cầu một phương pháp mở rộng, tôi nghĩ vậy.
abatishchev

4
Ngày cuối cùng không chỉ dành riêng cho tháng, bạn cũng cần cả năm. Ngày cuối cùng của tháng 2 năm 2010 là 28, nhưng ngày cuối cùng của tháng 2 năm 2008 là 29.
Guffa

@abatishchev Nó không yêu cầu một phương thức mở rộng, nhưng câu hỏi không thực sự yêu cầu nó. Tuy nhiên, nó đẹp hơn nhiều và dễ đọc hơn, ít nhất là với tôi, để xem nó. Phương pháp mở rộng là một gợi ý hơn bất cứ điều gì. Bất kỳ giải pháp sẽ làm việc trong một phương pháp mở rộng, không chỉ của tôi.
Đánh dấu

Câu trả lời:


655

Ngày cuối cùng của tháng bạn nhận được như thế này, trả về 31:

DateTime.DaysInMonth(1980, 08);

28
công khai DateTime ConvertToLastDayOfMonth (DateTime date) {trả về DateTime mới (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); } để có được ngày cuối cùng của tháng theo định dạng ngày
regisbsb

175
var lastDayOfMonth = DateTime.DaysInMonth(date.Year, date.Month);

@Henk Thật ra tôi đã lấy cái này từ một nơi trong nguồn của chúng tôi tạo ra DateTimetừ lastDayOfMonth. Thành thật một trong hai cách làm việc hoàn toàn tốt. Đó là một cuộc tranh luận mang tính mô phạm mà cách nào tốt hơn. Tôi đã làm cả hai cách và cả hai đều cho cùng một câu trả lời.
Đánh dấu

37

Nếu bạn muốn ngày , được đưa ra một tháng và một năm, điều này có vẻ đúng:

public static DateTime GetLastDayOfMonth(this DateTime dateTime)
{
    return new DateTime(dateTime.Year, dateTime.Month, DateTime.DaysInMonth(dateTime.Year, dateTime.Month));
}

9

Trừ một ngày từ đầu tháng sau:

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

Ngoài ra, trong trường hợp bạn cũng cần nó để làm việc cho tháng 12:

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

6

Bạn có thể tìm thấy ngày cuối cùng của bất kỳ tháng nào bằng mã này:

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

Bạn có thể tìm thấy ngày cuối cùng của tháng bằng một dòng mã:

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

Tôi tự hỏi rằng thay vì phương pháp đơn giản: DateTime.DaysInMonthtại sao ai đó nên tìm cách khó hiểu và phức tạp này để đạt được nó!? - Nhưng như một giải pháp hợp lệ là chấp nhận được;).
shA.t

5

Từ DateTimePicker:

Buổi hẹn đầu tiên:

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

Ngày cuối cùng:

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

2

Để có được ngày cuối cùng của tháng trong một lịch cụ thể - và theo phương thức mở rộng -:

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;
}

2
// 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));

Câu trả lời này chỉ trả lời cho ví dụ của người hỏi. Một câu trả lời toàn diện hơn sẽ hữu ích hơn.
Scott Lawrence

Bạn có thể sử dụng bất kỳ ngày nào bạn muốn làm giá trị đầu vào, vì vậy bạn có thể áp dụng giải pháp này cho bất kỳ ngày nào bạn muốn.
Jasper Risseeuw

1
Nó sẽ thất bại trong một số ngày, thử var myDate = new DateTime(1980, 1, 31);(trả lại ngày 29)
Hans Ke vào

Hans Ke st ing, bạn đã đúng. Phương pháp này sẽ thất bại nếu tháng tiếp theo có ít ngày hơn hiện tại. Tôi đoán cách dễ nhất là sử dụng DateTime.DaysInMonth () nhưng đó là câu trả lời được chấp nhận để câu trả lời của tôi sẽ bị xóa.
Jasper Risseeuw

-1

Tôi không biết C # nhưng, nếu nó không có cách API thuận tiện để có được nó, một trong những cách bạn có thể làm là bằng cách tuân theo logic:

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

Tất nhiên, điều đó giả định rằng bạn có toán ngày theo kiểu đó.


Điều này không chính xác.
EJoshuaS - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.