ตั้งค่า DateTime เพื่อเริ่มต้นเดือน


99

ฉันจะตั้งวันที่และเวลาเป็นวันแรกของเดือนใน C # ได้อย่างไร


เริ่มต้นของเดือนปัจจุบัน?
Phil Gan

1
แล้วจะได้อะไรบ้าง .. วันที่ของทุกเดือนเริ่มต้นด้วย 1 .. เขาอยากรู้วันต้นเดือนหรือ
เปล่า

ถ้าเราอยู่ในเดือน ม.ค. ควรแสดง 01 ม.ค. 2554 และ ก.พ. จากนั้น 01 ก.พ. 2554
เรียนรู้

คุณสามารถดูสิ่งนี้
V4Vendetta

คำตอบ:


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

62
เคล็ดลับ: ใส่DateTime.Nowลงในตัวแปรเสมอและใช้สิ่งนั้นหากคุณจะใช้ค่าซ้ำ ๆ มีโอกาสเกิดข้อผิดพลาดเล็กน้อยในกรณีที่รหัสนี้ทำงานประมาณเที่ยงคืน การโทรทั้งสองครั้งDateTime.Nowอาจเกิดขึ้นในแต่ละด้านของเวลาเที่ยงคืนทำให้เกิดผลกระทบที่แปลกประหลาด
Fredrik Mörk

จุดดี. ฉันคิดว่าเที่ยงคืนของวันส่งท้ายปีเก่าเป็นเวลาที่อาจทำให้เกิดปัญหาได้
Nick Jones

1
ไม่ใช่แค่ปีใหม่ มันจะมีปัญหาตอนเที่ยงคืนของวันสุดท้ายของเดือน ไม่ว่าในกรณีใดมันจะมีปัญหาก็ต่อเมื่อมีการดำเนินการในช่วงนาโนวินาทีของเที่ยงคืนสิ้นเดือน แต่เมื่อคุณแก้ไขรหัสของคุณตอนนี้ทุกอย่างก็เรียบร้อยดี
Doug S

1
ทำไมคุณถึงใช้ "var" แทน "DateTime"
markthewizard1234

4
@ markthewizard1234 เป็นหลักเนื่องจากโปรแกรมเมอร์ C # ขี้เกียจ ดังนั้นเราจึงใช้ var ทุกครั้งที่ทำได้เนื่องจากมีเพียงสามอักขระ มีเหตุผลอื่น แต่ฉันรู้สึกว่านี่เป็นเหตุผลหลักที่คนส่วนใหญ่ทำ
Tim Pohlmann

41

สิ่งนี้จะได้ผล

DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);

4
ดังที่ Fredrik Mork แสดงความคิดเห็นเกี่ยวกับคำตอบของ Nick Jones คุณควรจัดเก็บ Datetime ไว้ในตัวแปรเมื่อคุณใช้งานหลายครั้งเพื่อรับประกันว่าจะไม่มีปัญหาประมาณเที่ยงคืนของวันสุดท้ายของเดือน ดังนั้น: DateTime today = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Doug S


9

ไปงานปาร์ตี้สายไปหน่อย แต่นี่คือวิธีการขยายที่ใช้เคล็ดลับสำหรับฉัน

public static class DateTimeExtensions
{
  public static DateTime FirstDayOfMonth(this DateTime dt)
  {
    return new DateTime(dt.Year, dt.Month, 1);
  }
}

1
ปัญหานี้คือมันไม่ได้รักษาเขตเวลาเดิมไว้
Mike Cole

2
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);

คุณสามารถใช้สิ่งอื่นแทน DateTime.Now


2

ฉันเพิ่งสร้างวิธีการขยายตามคำตอบของ Nick และอื่น ๆ ใน SO

public static class DateTimeExtensions 
{
    /// <summary>
    /// get the datetime of the start of the week
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="startOfWeek"></param>
    /// <returns></returns>
    /// <example>
    /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
    /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
    /// </example>
    /// <remarks>http://stackoverflow.com/a/38064/428061</remarks>
    public static System.DateTime StartOfWeek(this System.DateTime dt, DayOfWeek startOfWeek)
    {
        var diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
            diff += 7;

        return dt.AddDays(-1 * diff).Date;
    }

    /// <summary>
    /// get the datetime of the start of the month
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    /// <remarks>http://stackoverflow.com/a/5002582/428061</remarks>
    public static System.DateTime StartOfMonth(this System.DateTime dt) =>
        new System.DateTime(dt.Year, dt.Month, 1);


    /// <summary>
    /// get datetime of the start of the year
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static System.DateTime StartOfYear(this System.DateTime dt) => 
         new System.DateTime(dt.Year, 1, 1);

}

0

สิ่งนี้ควรมีประสิทธิภาพและถูกต้อง:

DateTime RoundDateTimeToMonth(DateTime time)
{
    long ticks = time.Ticks;
    return new DateTime((ticks / TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind);
}

ที่นี่ticks / TimeSpan.TicksPerDayจะคืนค่าจำนวนวันเต็มจนถึงที่กำหนดtimeและ- time.Day + 1รีเซ็ตการนับนี้เป็นต้นเดือน



-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));

3
นี่ค่อนข้างซ้ำกับคำตอบของ fubo คุณไม่คิดเหรอ?
Thomas Ayoub

2
แม้ว่ารหัสนี้อาจช่วยแก้ปัญหาได้ แต่ขอแนะนำให้เพิ่มคำอธิบายที่อธิบายว่าเหตุใด / ทำงานอย่างไร
BDL

@ThomasAyoub - ไม่นี่ไม่ใช่คำตอบที่ค่อนข้างซ้ำกับคำตอบของ fubo เนื่องจากจะไม่มีเวลาที่ชัดเจน
Jay Shah

@BDL - ฉันคิดว่ามันง่ายมากที่จะเข้าใจซึ่งไม่ต้องการคำอธิบาย แต่ FYI ฉันใช้วันที่ Utc ปัจจุบันแล้วลบ (วันของวันที่ปัจจุบัน - 1) ออกเพื่อให้ได้วันที่เริ่มต้นของเดือนคือ 1 (ไม่ใช่ 0 และนั่นคือสาเหตุที่ฉันลบ 1) และใช่นี่จะช่วยแก้ปัญหาได้อย่างแน่นอน
Jay Shah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.