Câu trả lời:
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 DateTime
bỏ 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 DateTime
tài liệu ). Các ngoại lệ duy nhất là .Now
và .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. ZonedDateTime
Loạ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 tz
mục cơ sở dữ liệu .
Add
cung 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 ...
DateTime
giâ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;
time
không nên là một DateTime
. (Tất nhiên tôi sẽ sử dụng Noda Time, nhưng ...)
Đượ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);
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 DateTime
là một triển khai "ngây thơ" về mặt datetime
mô-đun của Python .
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.
.AddMilliseconds()
nếu cần.
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
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);
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 Add
phươ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 TimeOfDay
bất động sản là một TimeSpan
đối tượng và có thể được truyền cho Add
phương pháp. Và vì chúng ta sử dụng thuộc Date
tính của dateToUse
biến nên chúng ta chỉ lấy ngày và thêm khoảng thời gian.
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");
Vì DateTime
là 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 DateTime
thành phần riêng lẻ như
var now = DateTime.Now;
now.SetSecond(0);
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)
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.
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);
Sử dụng Date.Add
và thêm New TimeSpan
thời gian mới mà bạn muốn thêm
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
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 DateTime
phươ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 myDateTime
biến. Điều này là do tính DateTime
khô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 TimeSpan
vào bản gốc DateTime
thay 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 DateTime
và 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
Đâ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
);
}
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;
//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();
Bạn có thể gán giá trị ban đầu cho một DateTime
giá trị mới theo nhiều cách khác nhau:
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);
Có gì sai với phương thức DateTime.AddSeconds nơi bạn có thể thêm hoặc trừ giây?
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));
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
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);
Đâ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));
dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)
nhưng sẽ không đề nghị nó.