đặt DateTime thành đầu tháng


97

Làm cách nào để đặt DateTime vào ngày đầu tiên của tháng trong C #?


đầu tháng hiện tại?
Phil Gan

1
vì vậy những gì để có được về nó, .. bắt đầu ngày của mỗi tháng với 1..does ông muốn biết ngày về sự bắt đầu của Tháng
Shekhar_Pro

Nếu chúng ta đang ở trong tháng 1, nó sẽ hiển thị từ ngày 01 tháng 1 năm 2011 và vào tháng 2, sau đó là ngày 01 tháng 2 năm 2011
học

bạn có thể nhìn vào này
V4Vendetta

Câu trả lời:


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

62
Một mẹo: luôn đặt DateTime.Nowvào một biến và sử dụng biến đó nếu bạn định sử dụng giá trị đó nhiều lần. Có khả năng xảy ra lỗi nhỏ trong trường hợp mã này được thực thi chính xác vào khoảng nửa đêm; hai cuộc gọi đến DateTime.Nowcó thể xảy ra ở mỗi bên của nửa đêm gây ra những hiệu ứng kỳ lạ.
Fredrik Mörk

Điểm tốt. Tôi nghĩ nửa đêm giao thừa là thời điểm điều này có khả năng gây ra vấn đề.
Nick Jones

1
Không chỉ năm mới. Sẽ có vấn đề vào lúc nửa đêm của ngày cuối cùng của bất kỳ tháng nào. Trong mọi trường hợp, sẽ chỉ là một vấn đề nếu nó được thực thi vào chính giây nano của nửa đêm cuối tháng. Nhưng kể từ khi bạn sửa mã của mình, mọi thứ đều tốt.
Doug S

1
tại sao bạn lại sử dụng "var" thay vì "DateTime"?
markthewizard1234

4
@ markthewizard1234 chủ yếu là do các lập trình viên C # lười biếng. Vì vậy, chúng tôi chỉ sử dụng var bất cứ khi nào có thể vì nó chỉ có ba ký tự. Có những lý do khác nhưng tôi cảm thấy đây là lý do chính để hầu hết mọi người làm điều đó.
Tim Pohlmann

41

Một cái gì đó như thế này sẽ hoạt động

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

4
Như Fredrik Mork đã nhận xét về câu trả lời của Nick Jones, tốt nhất nên lưu trữ Ngày giờ trong một biến khi bạn đang sử dụng nó nhiều lần, để đảm bảo không có vấn đề gì vào khoảng nửa đêm vào ngày cuối cùng của tháng. Vì vậy: DateTime hôm nay = 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
Điều này tốt hơn vì nó giữ múi giờ.
Rosdi Kasim

8

Đến bữa tiệc hơi muộn nhưng đây là một phương pháp mở rộng đã làm được mẹo cho tôi

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

1
Vấn đề với điều này là nó không giữ múi giờ ban đầu.
Mike Cole

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

Bạn có thể sử dụng bất kỳ thứ gì khác thay vì DateTime.Now


2

Tôi vừa tạo một số phương thức mở rộng dựa trên câu trả lời của Nick và những phương thức khác trên 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

Điều này phải hiệu quả và chính xác:

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

Ở đây ticks / TimeSpan.TicksPerDaytrả về số ngày đầy đủ cho đến khi nhất định time- time.Day + 1đặt lại số này vào đầu tháng.


0

Hy vọng điều này sẽ giúp bạn.

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


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

3
Đây là một câu trả lời khá trùng lặp của fubo, bạn có nghĩ vậy không?
Thomas Ayoub

2
Mặc dù mã này có thể giải quyết vấn đề, nhưng nó luôn được khuyến khích thêm phần giải thích lý do tại sao / cách nó hoạt động với nó.
BDL

@ThomasAyoub - Không, đây không phải là câu trả lời khá trùng lặp của fubo vì nó sẽ không chứa cổng thời gian.
Jay Shah

@BDL - Tôi nghĩ nó rất đơn giản để hiểu mà không cần giải thích. Nhưng FYI, tôi đã lấy Ngày Utc hiện tại và sau đó trừ (Ngày của ngày hiện tại - 1) từ nó để có ngày bắt đầu của tháng tức là 1 (không phải 0 và đó là lý do tại sao tôi trừ đi 1). Và có, điều này chắc chắn sẽ giải quyết được vấn đề.
Jay Shah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.