ฉันจะได้รับวันสุดท้ายของเดือนได้อย่างไร


324

ฉันจะหาวันสุดท้ายของเดือนใน C # ได้อย่างไร

ตัวอย่างเช่นหากฉันมีวันที่ 03/08/1980 ฉันจะได้รับวันสุดท้ายของเดือนที่ 8 (ในกรณีนี้ 31) ได้อย่างไร


2
@ Mark: ฉันจะขออะไรได้บ้าง ฉันคิดว่าคำตอบของคุณไม่จำเป็นต้องใช้วิธีการขยาย
abatishchev

4
วันสุดท้ายไม่เฉพาะเดือนเท่านั้นคุณต้องการปีด้วย วันสุดท้ายของเดือนกุมภาพันธ์ 2010 คือ 28 แต่วันสุดท้ายของเดือนกุมภาพันธ์ 2008 คือ 29
Guffa

@abatishchev มันไม่จำเป็นต้องมีวิธีการขยาย แต่คำถามไม่ได้ถามมัน อย่างไรก็ตามมันเป็นสิ่งที่ดีกว่าและสามารถอ่านได้มากขึ้นอย่างน้อยสำหรับฉันที่จะเห็นมัน วิธีการขยายเป็นข้อเสนอแนะมากกว่าสิ่งใด วิธีการแก้ปัญหาใด ๆ ที่จะทำงานในวิธีการขยายไม่ใช่แค่ของฉัน
Mark

คำตอบ:


654

วันสุดท้ายของเดือนที่คุณได้รับเช่นนี้ซึ่งจะคืน 31:

DateTime.DaysInMonth(1980, 08);

28
สาธารณะแบบคงที่ DateTime ConvertToLastDayOfMonth (วันที่ DateTime) {ส่งคืน DateTime ใหม่ (date.Year, date.Month, DateTime.DaysInMonth (date.Year, date.Month)); } เพื่อรับวันสุดท้ายของเดือนในรูปแบบวันที่
regisbsb

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

@Henk จริงผมดึงนี้จากสถานที่ในแหล่งที่มาของเราที่สร้างมาจากDateTime lastDayOfMonthสุจริตทั้งสองวิธีทำงานได้ดีอย่างสมบูรณ์ มันเป็นเรื่องอวดรู้ที่ทางไหนดีกว่ากัน ฉันทำไปแล้วทั้งสองวิธีและทั้งคู่ก็ให้คำตอบเดียวกัน
มาร์ค

37

หากคุณต้องการวันที่ที่ได้รับเดือนและปีสิ่งนี้น่าจะถูกต้อง:

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

9

ย่อวันจากวันที่ 1 ของเดือนถัดไป:

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

นอกจากนี้ในกรณีที่คุณต้องการให้ทำงานในเดือนธันวาคมด้วย:

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

6

คุณสามารถค้นหาวันสุดท้ายของเดือนใด ๆ ด้วยรหัสนี้:

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

คุณสามารถค้นหาวันสุดท้ายของเดือนด้วยรหัสบรรทัดเดียว:

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

มันสงสัยฉันว่าแทนที่จะใช้วิธีง่าย ๆ : DateTime.DaysInMonthทำไมบางคนควรมองหาวิธีที่ไม่สามารถอ่านได้และซับซ้อนนี้เพื่อให้บรรลุ! - แต่เป็นวิธีการแก้ปัญหาที่ถูกต้องเป็นที่ยอมรับ;)
shA.t

5

จาก 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));

2

ในการรับวันสุดท้ายของเดือนในปฏิทินที่ต้องการ - และในวิธีการขยาย -:

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

คำตอบนี้ตอบเฉพาะตัวอย่างของผู้ถามเท่านั้น คำตอบที่ครอบคลุมมากขึ้นจะเป็นประโยชน์มากขึ้น
Scott Lawrence

คุณสามารถใช้วันที่ใดก็ได้ที่คุณต้องการเป็นค่าอินพุทดังนั้นคุณสามารถใช้วิธีนี้กับวันที่ที่คุณต้องการ
Jasper Risseeuw

1
มันจะล้มเหลวในบางวันลองvar myDate = new DateTime(1980, 1, 31);(คืน 29)
ฮันส์ Ke Ke ing

Hans Ke Keing คุณพูดถูก วิธีนี้จะล้มเหลวหากเดือนถัดไปมีจำนวนวันน้อยกว่าปัจจุบัน ฉันเดาวิธีที่ง่ายที่สุดคือการใช้ DateTime.DaysInMonth () แต่นั่นเป็นคำตอบที่ยอมรับได้ดังนั้นควรลบคำตอบของฉัน
Jasper Risseeuw

-1

ฉันไม่รู้ C # แต่ถ้าปรากฏว่าไม่มีวิธี API ที่สะดวกในการรับวิธีหนึ่งที่คุณสามารถทำได้คือทำตามตรรกะ:

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

แน่นอนว่าคุณมีคณิตศาสตร์วันที่ของประเภทนั้น


มันไม่ถูกต้อง
EJoshuaS - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.