DateTime'ı ayın başlangıcına ayarlayın


99

C # 'da ayın ilkine bir DateTime nasıl ayarlayabilirim?


mevcut ayın başlangıcı?
Phil Gan

1
öyleyse ne öğrenmeli, .. her ayın tarihi 1 ile başlar. Ayın başlangıcındaki Günü bilmek ister mi
Shekhar_Pro

Ocak ayındaysak, 01 Ocak
öğreniyoruz

İçine bakabilirsiniz bu
V4Vendetta

Yanıtlar:


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

62
Bir ipucu: her zaman DateTime.Nowbir değişkene koyun ve değeri tekrar tekrar kullanacaksanız bunu kullanın. Bu kodun tam olarak gece yarısı civarında çalıştırılması durumunda küçük bir hata olasılığı vardır; iki çağrı DateTime.Nowgece yarısının her iki tarafında olabilir ve muhtemelen garip etkilere neden olabilir.
Fredrik Mörk

İyi bir nokta. Yeni yıl arifesinde gece yarısı, bunun potansiyel olarak bir soruna neden olacağı zamandır.
Nick Jones

1
Sadece Yeni Yıl değil. Herhangi bir ayın son günü gece yarısı sorun olur. Her halükarda, yalnızca ayın sonunda gece yarısının o nanosaniyesinde çalıştırılırsa sorun olur. Ama kodunuzu düzelttiğinizden beri her şey yolunda.
Doug S

1
neden "DateTime" yerine "var" kullanıyorsunuz?
markthewizard1234

4
@ markthewizard1234 temel olarak C # programcılarının tembel olması nedeniyle. Bu yüzden, sadece üç karakter olduğu için, mümkün olduğunda sadece var kullanırız. Başka nedenler de var ama bence çoğu insanın bunu yapmasının ana nedeni bu.
Tim Pohlmann

41

Bunun gibi bir şey işe yarar

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

4
Fredrik Mork'un Nick Jones cevabına yorum yaptığı gibi, ayın son günü gece yarısı civarında sorun yaşamamak için, Datetime'ı birden çok kez kullandığınızda bir değişkende saklamak en iyisidir. Yani: DateTime today = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Doug S

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

1
Bu, zaman dilimini koruduğu için daha iyidir.
Rosdi Kasım

9

Partiye biraz geç kaldım ama işte benim için hile yapan bir uzatma yöntemi

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

1
Bununla ilgili sorun, orijinal saat dilimini korumamasıdır.
Mike Cole

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

DateTime yerine başka bir şey kullanabilirsiniz.Now


2

Sadece Nick cevabına ve diğerlerine de SO'ya dayalı bazı genişletme yöntemleri oluşturdum

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

Bu verimli ve doğru olmalıdır:

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

Burada ticks / TimeSpan.TicksPerDayverilene kadar olan tam günlerin sayısını döndürür timeve - time.Day + 1bu sayımı ayın başına sıfırlar.


0

Umarım bu size yardımcı olur.

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


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

3
Bu, fubo'nun cevabının oldukça kopyası, sence de öyle değil mi?
Thomas Ayoub

2
Bu kod sorunu çözebilecek olsa da, her zaman neden / nasıl çalıştığını açıklayan bir açıklama eklemesi önerilir.
BDL

@ThomasAyoub - Hayır, bu, zaman portainini içermeyeceği için fubo'nun cevabının oldukça kopyası değil.
Jay Shah

@BDL - Hangisinin açıklama gerektirmediğini anlamak çok basit. Ama bilginize, şu anki Utc Tarihini aldım ve ardından ayın başlangıç ​​tarihini yani 1'i (0 değil ve bu yüzden 1 çıkardım) elde etmek için ondan (Geçerli tarihin günleri - 1) çıkardım. Ve evet, bu kesinlikle sorunu çözecektir.
Jay Shah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.