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.