Làm cách nào để thay đổi thời gian trong DateTime?


353

Làm cách nào tôi chỉ có thể thay đổi thời gian trong DateTimebiến "s" của mình?

DateTime s = some datetime;

Câu trả lời:


598

Bạn không thể thay đổi giá trị DateTime - nó không thay đổi. Tuy nhiên, bạn có thể thay đổi biến để có giá trị mới. Cách dễ nhất để làm điều đó chỉ thay đổi thời gian là tạo TimeSpan với thời gian phù hợp và sử dụng thuộc tính DateTime.Date:

DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;

s bây giờ sẽ là cùng một ngày, nhưng lúc 10:30 sáng.

Lưu ý rằng DateTimebỏ qua việc chuyển đổi thời gian tiết kiệm ánh sáng ban ngày, thể hiện thời gian Gregorian "ngây thơ" theo cả hai hướng (xem phần Ghi chú trong DateTimetài liệu ). Các ngoại lệ duy nhất là .Now.Today: chúng truy xuất thời gian hệ thống hiện tại phản ánh những sự kiện này khi chúng xảy ra.

Đây là loại điều thúc đẩy tôi bắt đầu dự án Noda Time , hiện đã sẵn sàng sản xuất. ZonedDateTimeLoại của nó được thực hiện "nhận biết" bằng cách liên kết nó với một tzmục cơ sở dữ liệu .


11
s.Date.Add (TimeSpan mới (0, 0, 0)) cũng sẽ hoạt động. Sử dụng nó để null thời gian khi kiểm tra giữa các ngày.
Sữa chua The Wise

8
@ user295734: Tại sao bạn gọi Addcung cấp thời gian không? Biểu hiện của bạn tương đương với s.Date, nhưng lâu hơn ...
Jon Skeet

Quên sửa nó, nhận ra nó sau khi tôi đặt nó vào mã, để đặt thành không (cái mà tôi đang tìm kiếm ban đầu). Nhưng tôi chỉ cố gắng chỉ ra làm thế nào để đặt thời gian thành một dòng, nếu không đặt thành 0.
Yogurt The Wise

3
Nếu bạn có 2 DateTimegiây, (một cho ngày và một cho thời gian), bạn có thể làm điều này:var result = date.Date + time.TimeOfDay;
Zachary Yates

2
@ZacharyYates: Có, mặc dù tôi cho rằng tại thời điểm đó, mô hình của bạn bị hỏng để bắt đầu và timekhông nên là một DateTime. (Tất nhiên tôi sẽ sử dụng Noda Time, nhưng ...)
Jon Skeet

100

Được rồi, tôi đang tìm hiểu về đề xuất của mình, một phương pháp mở rộng:

public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds, int milliseconds)
{
    return new DateTime(
        dateTime.Year,
        dateTime.Month,
        dateTime.Day,
        hours,
        minutes,
        seconds,
        milliseconds,
        dateTime.Kind);
}

Sau đó gọi:

DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);

Điều quan trọng cần lưu ý là tiện ích mở rộng này trả về một đối tượng ngày mới , vì vậy bạn không thể làm điều này:

DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);

Nhưng bạn có thể làm điều này:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);

6
Điều này về cơ bản là giống như Datetime.Today.Add(time.TimeOfDay). Đó là bởi vì trong nội bộ, nhà xây dựng không thực hiện bất kỳ chỉnh sửa dựa trên lịch nào ngoại trừ kế toán cho một năm nhuận cho phần ngày. Tức DateTimelà một triển khai "ngây thơ" về mặt datetimemô-đun của Python .
ivan_pozdeev

68
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

Bằng cách này, bạn giữ được ngày của mình, trong khi chèn một phần giờ, phút và giây mới theo ý thích của bạn.


@Webleeuw Tất nhiên, khả năng từ xa của ArgumentOutOfRangeException tùy thuộc vào các giá trị được thêm vào. Đây là một câu đố Pex chứng minh điều này.
cuộc sống

Và tùy thuộc vào trường hợp sử dụng, cũng có thể làm .AddMilliseconds()nếu cần.
Broots Waymb

40

lót

var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));

sẽ mang lại ngày hôm nay với thời gian 4:30:00, thay thế DateTime. Bây giờ với bất kỳ đối tượng ngày nào


22

DateTime là một loại không thay đổi, vì vậy bạn không thể thay đổi nó.

Tuy nhiên, bạn có thể tạo một phiên bản DateTime mới dựa trên phiên bản trước đó của bạn. Trong trường hợp của bạn, có vẻ như bạn cần thuộc tính Date và sau đó bạn có thể thêm TimeSpan đại diện cho thời gian trong ngày.

Một cái gì đó như thế này:

var newDt = s.Date + TimeSpan.FromHours(2);

17

Nếu bạn đã có thời gian được lưu trữ trong một DateTimeđối tượng khác, bạn có thể sử dụng Addphương thức này.

DateTime dateToUse = DateTime.Now();
DateTime timeToUse = new DateTime(2012, 2, 4, 10, 15, 30); //10:15:30 AM

DateTime dateWithRightTime = dateToUse.Date.Add(timeToUse.TimeOfDay);

Các TimeOfDaybất động sản là một TimeSpanđối tượng và có thể được truyền cho Addphương pháp. Và vì chúng ta sử dụng thuộc Datetính của dateToUsebiến nên chúng ta chỉ lấy ngày và thêm khoảng thời gian.


16

Giải pháp đơn giản nhất:

DateTime s = //some Datetime that you want to change time for 8:36:44 ;
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44);

Và nếu bạn cần một Định dạng Ngày và Giờ cụ thể:

s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");

9
DateTime ts = DateTime.Now;
ts = new DateTime ( ts.Year, ts.Month, ts.Day, 0, 0, 0 ) ;
Console.WriteLine ( "Today = " + ts.ToString("M/dd/yy HH:mm:ss") ) ;

Đã thực hiện: Hôm nay = 9/04/15 00:00:00


8

Đã xảy ra khi bài đăng này khi tôi đang tìm kiếm chức năng tương tự, điều này có thể có thể làm những gì chàng trai muốn. Lấy ngày ban đầu và thay thế phần thời gian

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");

4

DateTimelà bất biến, một thể hiện mới phải được tạo khi cần thay đổi thành phần ngày. Thật không may, không có chức năng tích hợp để đặt các thành phần riêng lẻ của mộtDateTime thể hiện.

Sử dụng các phương pháp mở rộng sau

public static DateTime SetPart(this DateTime dateTime, int? year, int? month, int? day, int? hour, int? minute, int? second)
{
    return new DateTime(
        year ?? dateTime.Year,
        month ?? dateTime.Month,
        day ?? dateTime.Day,
        hour ?? dateTime.Hour,
        minute ?? dateTime.Minute,
        second ?? dateTime.Second
    );
}

public static DateTime SetYear(this DateTime dateTime, int year)
{
    return dateTime.SetPart(year, null, null, null, null, null);
}

public static DateTime SetMonth(this DateTime dateTime, int month)
{
    return dateTime.SetPart(null, month, null, null, null, null);
}

public static DateTime SetDay(this DateTime dateTime, int day)
{
    return dateTime.SetPart(null, null, day, null, null, null);
}

public static DateTime SetHour(this DateTime dateTime, int hour)
{
    return dateTime.SetPart(null, null, null, hour, null, null);
}

public static DateTime SetMinute(this DateTime dateTime, int minute)
{
    return dateTime.SetPart(null, null, null, null, minute, null);
}

public static DateTime SetSecond(this DateTime dateTime, int second)
{
    return dateTime.SetPart(null, null, null, null, null, second);
}

bạn có thể thiết lập các DateTimethành phần riêng lẻ như

var now = DateTime.Now;

now.SetSecond(0);

3

Nếu bạn có DateTime như 2014/02/05 18:19:51 và chỉ muốn 2014/02/05, bạn có thể làm điều đó:

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)

3

Thêm .Date vào ngày của bạn sẽ đặt nó vào nửa đêm (00:00).

MyDate.Date

Lưu ý SQL tương đương làCONVERT(DATETIME, CONVERT(DATE, @MyDate))

Điều làm cho phương pháp này trở nên tốt là nó vừa nhanh vừa gõ và dễ đọc. Một phần thưởng là không có chuyển đổi từ chuỗi.

Tức là để đặt ngày hôm nay đến 23:30, sử dụng:

DateTime.Now.Date.AddHours(23).AddMinutes(30)

Tất nhiên bạn có thể thay thế DateTime.Now hoặc MyDate bằng bất kỳ ngày nào bạn chọn.


3

Thực tế, bạn không thể thay đổi thời gian khi nó được tạo. Nhưng bạn có thể tạo nó dễ dàng với nhiều nhà xây dựng: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2

Ví dụ: nếu bạn muốn tạo một giây thay đổi DateTime, bạn có thể thực hiện việc này:

DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);

2
int year = 2012;
int month = 12;
int day = 24;
int hour = 0;
int min = 0;
int second = 23;
DateTime dt = new DateTime(year, month, day, hour, min, second);

2

Sử dụng Date.Addvà thêm New TimeSpanthời gian mới mà bạn muốn thêm

DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))

1

Khi bạn xây dựng DateTimeđối tượng của mình , hãy sử dụng hàm tạo cho phép bạn chỉ định thời gian:

var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42);  // 2000-01-01 13:37:42

Nếu bạn đã có một DateTimeđối tượng và muốn thay đổi thời gian, bạn có thể thêm phút, giờ hoặc giây vào DateTimephương thức đơn giản của mình :

var myDateTime = new DateTime(2000, 01, 01);              // 2000-01-01 00:00:00
myDateTime = myDateTime.AddHours(13);                     // 2000-01-01 13:00:00
myDateTime = myDateTime.AddMinutes(37);                   // 2000-01-01 13:37:00
myDateTime = myDateTime.AddSecounds(42);                  // 2000-01-01 13:37:42

Lưu ý cách chúng ta phải "lưu" kết quả từ mỗi lệnh gọi phương thức vào myDateTimebiến. Điều này là do tính DateTimekhông thay đổi và các phương thức của nó chỉ đơn giản là tạo các thể hiện mới với thêm giờ / phút / giây được thêm vào.

Nếu bạn cần thêm cả giờ và phút (và / hoặc giây) và cùng một lúc, bạn có thể đơn giản hóa mã bằng cách thêm a TimeSpanvào bản gốc DateTimethay thế:

var myDateTime = new DateTime(2000, 01, 01);              // 2000-01-01 00:00:00
myDateTime += new TimeSpan(13, 37, 42);                   // 2000-01-01 13:37:42

Nếu bạn muốn đặt giờ / phút / giây tuyệt đối, thay vì thêm vào các giá trị hiện có, bạn có thể sử dụng hàm tạo đã nói ở trên DateTimevà sử dụng lại các giá trị cho năm / tháng / ngày từ trước đó:

myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
                          20, 33, 19)                     // 2000-01-01 20:33:19

Thêm và trừ bằng cách sử dụng các phương thức AddXXX
Chris Richner

1

Đây là một phương pháp bạn có thể sử dụng để làm điều đó cho bạn, sử dụng nó như thế này

DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);

Đây là phương pháp, có lẽ có một cách tốt hơn, nhưng tôi chỉ cần đánh nó lên:

public enum DateTimePart { Years, Months, Days, Hours, Minutes, Seconds };
public DateTime ChangeDateTimePart(DateTime dt, DateTimePart part, int newValue)
{
    return new DateTime(
        part == DateTimePart.Years ? newValue : dt.Year,
        part == DateTimePart.Months ? newValue : dt.Month,
        part == DateTimePart.Days ? newValue : dt.Day,
        part == DateTimePart.Hours ? newValue : dt.Hour,
        part == DateTimePart.Minutes ? newValue : dt.Minute,
        part == DateTimePart.Seconds ? newValue : dt.Second
        );
}

1

Tôi vừa xem bài đăng này vì tôi gặp vấn đề tương tự, theo đó tôi muốn đặt thời gian cho một đối tượng Entity Framework trong MVC lấy ngày từ chế độ xem (datepicker) vì vậy thành phần thời gian là 00:00:00 nhưng tôi cần đó là thời điểm hiện tại Dựa trên các câu trả lời trong bài này, tôi đã đưa ra:

myEntity.FromDate += DateTime.Now.TimeOfDay;

1
//The fastest way to copy time            

DateTime justDate = new DateTime(2011, 1, 1); // 1/1/2011 12:00:00AM the date you will be adding time to, time ticks = 0
DateTime timeSource = new DateTime(1999, 2, 4, 10, 15, 30); // 2/4/1999 10:15:30AM - time tick = x

justDate = new DateTime(justDate.Date.Ticks + timeSource.TimeOfDay.Ticks);

Console.WriteLine(justDate); // 1/1/2011 10:15:30AM
Console.Read();

1

Bạn có thể gán giá trị ban đầu cho một DateTimegiá trị mới theo nhiều cách khác nhau:

  • Phương pháp mở rộng

Phương pháp mở rộng DateTime

    public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds = default, int milliseconds = default)
    {
        return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, hours, minutes, seconds, milliseconds, dateTime.Kind);
    }

sau đó sử dụng ChangeTime:

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
  • sử dụng các phương thức Thêm

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
  • sử dụng Timespan

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
  • sử dụng giá trị ban đầu

    DateTime datetime = DateTime.Now;
    datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);

0

Có gì sai với phương thức DateTime.AddSeconds nơi bạn có thể thêm hoặc trừ giây?


Không chỉ vậy, nhưng nó không có vẻ như nó trả lời câu hỏi nào. Tôi nghi ngờ OP muốn có một DateTime có cùng ngày nhưng thời gian cụ thể - sẽ tương đối khó thực hiện nếu chỉ sử dụng AddSeconds.
Jon Skeet

0
  DateTime s;
//s = datevalue
                s = s.AddMilliseconds(10);
                s = s.AddMinutes(10);
                s = s.AddSeconds(10);
                s = s.AddHours(10);

bạn có thể thêm các giá trị + ve / -ve trong tham số.

s.Add(new TimeSpan(1, 1, 1));

@Jon: Tôi nhận xét dòng. người dùng cần gán một số giá trị trước khi sử dụng mã này.
Saar

@Saar: Quan trọng hơn, giờ đây bạn đã thêm các bài tập trở lại s (ngoại trừ lệnh gọi đến s.Add (...)).
Jon Skeet

@Jon: Tôi đã học được bài học của mình. Cảm ơn lòng tốt và thời gian của bạn. Tôi thực sự có ý đó.
Saar

0

Điều đó không khắc phục vấn đề của bạn à ??

Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);

0

Tôi thích điều này:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);

0
 Using an extencion to DateTime:  

        public enum eTimeFragment
        {
            hours,
            minutes,
            seconds,
            milliseconds
        }
        public static DateTime ClearTimeFrom(this DateTime dateToClear, eTimeFragment etf)
        {
            DateTime dtRet = dateToClear;
            switch (etf)
            {
                case eTimeFragment.hours:
                    dtRet = dateToClear.Date;
                    break;
                case eTimeFragment.minutes:
                    dtRet = dateToClear.AddMinutes(dateToClear.Minute * -1);
                    dtRet = dtRet.ClearTimeFrom(eTimeFragment.seconds);
                    break;
                case eTimeFragment.seconds:
                    dtRet = dateToClear.AddSeconds(dateToClear.Second * -1);
                    dtRet = dtRet.ClearTimeFrom(eTimeFragment.milliseconds);
                    break;
                case eTimeFragment.milliseconds:
                    dtRet = dateToClear.AddMilliseconds(dateToClear.Millisecond * -1);
                    break;
            }
            return dtRet;

        }

Sử dụng như thế này:

Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))

cái này phải trả lại: 2016-06-06 00: 00: 00.000


-1

Giải pháp tốt nhất là:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);

1
Lúc đầu tôi nghĩ điều này sai, nhưng sẽ hợp lý nếu bạn gán kết quả cho một đối tượng DateTime. Nó không phải là giải pháp tốt nhất mặc dù. Nó yêu cầu bạn phải biết phần Thời gian hiện tại để thực hiện các phép tính chính xác, trong khi lấy phần Ngày của ngày và thêm vào đó là phần tốt nhất.
ThunderGr

1
Chắc chắn không phải là "tốt nhất". Khác xa có thể đọc và với việc sử dụng lặp đi lặp lại của một số ma thuật.
BartoszKP

-1

Hãy thử cái này

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;

-5

Đây là một cách ghetto, nhưng nó hoạt động :)

DateTime dt = DateTime.Now; //get a DateTime variable for the example
string newSecondsValue = "00";
dt = Convert.ToDateTime(dt.ToString("MM/dd/yyyy hh:mm:" + newSecondsValue));

Một cách ghetto khác nhưng sạch sẽ hơn một chút sẽ chỉ là chơi với giây. ví dụ dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)nhưng sẽ không đề nghị nó.
mike
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.