2009-12-07 38 views

Trả lời

470

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

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

s bây giờ sẽ là ngày giống nhau, nhưng tại 10:30.

Lưu ý rằng DateTime bỏ qua các chuyển đổi thời gian tiết kiệm ánh sáng ban ngày, biểu thị thời gian Gregorian "ngây thơ" theo cả hai hướng (xem phần Ghi chú trong DateTime docs). 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 cho sản xuất. Loại ZonedDateTime của nó được làm "nhận biết" by linking it to a tz database entry.

+8

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

+7

@ user295734: Tại sao bạn gọi 'Thêm' cung cấp thời gian bằng 0? Biểu thức của bạn tương đương với 's.Date', nhưng dài hơn ... –

+0

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

0

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

+0

Không chỉ có vậy, nhưng nó không âm thanh như nó trả lời cho câu hỏi nào . Tôi nghi ngờ OP muốn một DateTime với cùng một ngày nhưng một thời gian cụ thể - đó sẽ là * tương đối * khó làm chỉ bằng cách sử dụng AddSeconds. –

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

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

+0

@Webleeuw Tất nhiên, một khả năng từ xa của một [ArgumentOutOfRangeException] (http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx) tùy thuộc vào các giá trị được thêm vào. Đây là câu đố [Pex] (http://pexforfun.com/default.aspx?language=CSharp&sample=Y2k) minh họa điều này. – lifebalance

+0

Và tùy thuộc vào trường hợp sử dụng, cũng có thể thực hiện '.AddMilliseconds()' nếu cần. –

19

Ngày giờ là loại không thay đổi, vì vậy bạn không thể thay đổi.

Tuy nhiên, bạn có thể tạo 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 một TimeSpan đại diện cho thời gian trong ngày.

Something như thế này:

var newDt = s.Date + TimeSpan.FromHours(2); 
-1
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 ve/giá trị ve trong tham số.

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

@mrnye: Tôi đã không giúp bạn. – Saar

+0

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

+0

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

0

Khi bạn xây dựng đối tượng DateTime của bạn, sử dụng một constructor 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 đối tượng DateTime và muốn thay đổi thời gian, UOU có thể thêm phút, giờ hoặc giây để DateTime sử dụng phương pháp đơn giản của bạn:

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 

Thông báo như thế nào, chúng ta phải "tiết kiệm" là kết quả của từng phương pháp c tất cả với biến số myDateTime. Điều này là do DateTime là không thay đổi và các phương thức của nó chỉ đơn giản là tạo các phiên bản mới với số giờ/phút/giây được thêm vào.

Nếu bạn cần phải thêm cả giờ và phút (và/hoặc giây) và đồng thời, bạn có thể đơn giản hóa mã bằng cách thêm một TimeSpan với bản gốc DateTime thay vì:

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 thiết lập tuyệt đối giờ/MINUES/giây, thay vì thêm vào các giá trị hiện tại, bạn có thể sử dụng nói trên DateTime constructor, và các giá trị tái sử dụng 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 
+0

Cộng và trừ bằng cách sử dụng các phương pháp AddXXX –

-5

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

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)); 
+1

Vâng, nó hoạt động nếu bạn tình cờ ở Hoa Kỳ ... –

+5

Khá, đó là không tốt cho tất cả các loại lý do – Murph

+0

Một cách ghetto khác nhưng một chút sạch sẽ là chỉ chơi với giây. ví dụ. 'dt.AddSeconds (0-dt.Seconds) .AddSeconds (newSecondsValue)' nhưng không khuyên bạn nên sử dụng nó. – mike

0

Điều đó có khắc phục được sự cố của bạn không ??

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

Được rồi tôi lặn với đề nghị của tôi, một phương pháp khuyến nô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à phần mở rộng này trả về một mới đối tượng ngày, vì vậy bạn không thể thực hiện việc 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); 
+4

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

1

Đây là một phương pháp mà 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ẽ là một tốt hơn nhưng tôi chỉ cần bỏ qua điều này:

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 qua bài đăng này vì tôi muốn đặt thời gian cho đối tượng khung thực thể trong MVC nhận ngày tháng từ chế độ xem (datepicker) để thành phần thời gian là 00:00:00 nhưng tôi cần nó là thời gian hiện tại. Dựa trên các câu trả lời trong bài đăng này, tôi đã đưa ra:

myEntity.FromDate += DateTime.Now.TimeOfDay; 
7

Đã xảy ra khi tôi đang tìm kiếm cùng một chức năng mà điều này có thể làm những gì anh chàng muốn. Lấy ngày đầu tiên và thay thế thời gian phần

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM"); 
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(); 
22

lót

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

sẽ mang lại ngày todays với một thời điểm 04:30:00, thay thế DateTime.Now với ngày bất kỳ đối tượng

13

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

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); 

Thuộc tính TimeOfDay là một đối tượng TimeSpan và có thể được truyền cho phương thức Add. Và vì chúng tôi sử dụng thuộc tính Date của biến số dateToUse, chúng tôi chỉ lấy ngày và thêm khoảng thời gian.

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); 
-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ĩ rằng điều này là sai, nhưng nó có ý nghĩa * 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ó đòi hỏi 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à tốt nhất. – ThunderGr

+1

Chắc chắn không phải là "tốt nhất". Không thể đọc được và sử dụng lặp lại số ma thuật. – BartoszKP

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); 
3

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

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day) 
6
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

2

Thêm .Ngày vào ngày của bạn đặt thành nửa đêm (00:00).

MyDate.Date 

Note SQL equivavalent là CONVERT(DATETIME, CONVERT(DATE, @MyDate))

Điều gì làm cho phương pháp này rất tốt là nó cả hai nhanh chóng để gõ và dễ đọc. Tiền thưởng là không có chuyển đổi từ chuỗi.

I.e. Để đặt ngày hôm nay là 23:30, hãy sử dụng:

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

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

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))

này đã trở lại: 2016/06/06 00: 00: 00.000

0

DateTime là không thay đổi, một phiên bả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 để thiết lập các thành phần riêng lẻ của một cá thể DateTime.

Sử dụng phương pháp khuyến nô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á nhân DateTime thành phần như

var now = DateTime.Now; 

now.SetSecond(0); 
2

Sử dụng Date.Add và thêm một New TimeSpan với thời gian mới mà bạn muốn thêm

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

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

DateTime s = new DateTime(datetime.Year, datetime.Month, datetime.Day, 8, 36, 44); 

Và nếu bạn cần một Date and Time cụ Format:

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

Hãy thử điều này một

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/; 
Các vấn đề liên quan