atur DateTime ke awal bulan


97

Bagaimana saya bisa mengatur DateTime ke yang pertama setiap bulan di C #?


awal bulan ini?
Phil Gan

1
jadi apa yang didapat tentang itu, .. tanggal setiap bulan dimulai dengan 1 .. apakah dia ingin tahu Hari di awal Bulan
Shekhar_Pro

Jika kita dalam Jan, itu harus menunjukkan 01-Jan-2011 dan pada Feb, kemudian 01-Feb-2011
belajar

Anda dapat melihat ini
V4Vendetta

Jawaban:


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

62
Tip: selalu masukkan DateTime.Nowke dalam variabel dan gunakan itu jika Anda akan menggunakan nilainya berulang kali. Ada kemungkinan kecil kesalahan jika kode ini dijalankan tepat sekitar tengah malam; dua panggilan untuk DateTime.Nowmungkin terjadi di setiap sisi tengah malam menyebabkan kemungkinan efek yang aneh.
Fredrik Mörk

Poin yang bagus. Saya pikir tengah malam pada malam tahun baru adalah waktu yang berpotensi menimbulkan masalah.
Nick Jones

1
Bukan hanya Tahun Baru. Ini akan menjadi masalah pada tengah malam pada hari terakhir setiap bulan. Bagaimanapun, itu hanya akan menjadi masalah jika dijalankan pada nanodetik tengah malam di akhir bulan. Tetapi karena Anda memperbaiki kode Anda, semuanya baik-baik saja sekarang.
Doug S

1
mengapa Anda menggunakan "var" dan bukan "DateTime"?
markthewizard1234

4
@ markthewizard1234 terutama karena pemrogram C # malas. Jadi kami hanya menggunakan var bila memungkinkan karena hanya tiga karakter. Ada alasan lain tapi saya rasa inilah alasan utama kebanyakan orang melakukannya.
Tim Pohlmann

41

Sesuatu seperti ini akan berhasil

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

4
Saat Fredrik Mork mengomentari jawaban Nick Jones, sebaiknya simpan Datetime dalam variabel saat Anda menggunakannya beberapa kali, untuk menjamin tidak ada masalah sekitar tengah malam pada hari terakhir bulan itu. Jadi: DateTime today = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Doug S

9
public static DateTime FirstDayOfMonth(this DateTime current)
{
    return current.AddDays(1 - current.Day);
}

1
Ini lebih baik karena menjaga zona waktu.
Rosdi Kasim

8

Agak terlambat ke pesta tetapi inilah metode ekstensi yang berhasil untuk saya

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

1
Masalahnya adalah ini tidak menjaga zona waktu asli.
Mike Cole

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

Anda dapat menggunakan apa pun selain DateTime.Now


2

Saya baru saja membuat beberapa metode ekstensi berdasarkan jawaban Nick dan lainnya di 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

Ini harus efisien dan benar:

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

Di sini ticks / TimeSpan.TicksPerDaymengembalikan hitungan hari penuh hingga diberikan timedan - time.Day + 1menyetel ulang hitungan ini ke awal bulan.


0

Semoga ini bisa membantu Anda.

textbox1.Text = "01-" + DateTime.Now.ToString ("MMM-yyyy");


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

3
Ini adalah duplikat dari jawaban fubo, bukan?
Thomas Ayoub

2
Meskipun kode ini mungkin menyelesaikan masalah, selalu dianjurkan untuk menambahkan penjelasan yang menjelaskan mengapa / bagaimana cara kerjanya.
BDL

@ThomasAyoub - Tidak, ini bukan duplikat dari jawaban fubo karena ini tidak akan mengandung waktu portain.
Jay Shah

@BDL - Saya pikir sangat mudah untuk dipahami yang tidak memerlukan penjelasan. Tetapi FYI, saya telah mengambil Tanggal Utc saat ini dan kemudian mengurangi (Hari dari tanggal saat ini - 1) darinya untuk mendapatkan tanggal awal bulan yaitu 1 (bukan 0 dan itulah mengapa saya mengurangi 1). Dan ya, ini pasti akan menyelesaikan masalah.
Jay Shah
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.