Jawaban:
Anda tidak dapat mengubah nilai DateTime - tidak dapat diubah. Namun, Anda dapat mengubah variabel untuk memiliki nilai baru. Cara termudah untuk melakukan itu hanya mengubah waktu adalah membuat TimeSpan dengan waktu yang relevan, dan menggunakan properti DateTime.Date:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
sekarang akan menjadi tanggal yang sama, tetapi pukul 10.30 pagi.
Perhatikan bahwa DateTime
mengabaikan transisi waktu musim panas, mewakili waktu Gregorian "naif" di kedua arah (lihat bagian Keterangan dalam DateTime
dokumen ). Satu-satunya pengecualian adalah .Now
dan.Today
: mereka mengambil waktu sistem saat ini yang mencerminkan peristiwa ini saat terjadi.
Ini adalah hal yang memotivasi saya untuk memulai proyek Noda Time , yang sekarang sudah siap produksi. Jenisnya ZonedDateTime
dibuat "sadar" dengan menautkannya ke tz
entri basis data .
Add
memberikan rentang waktu nol? Ekspresi Anda setara dengan s.Date
, tetapi lebih lama ...
DateTime
detik, (satu untuk tanggal dan satu untuk saat itu) Anda dapat melakukan ini:var result = date.Date + time.TimeOfDay;
time
seharusnya tidak menjadi DateTime
. (Tentu saja saya akan menggunakan Noda Time, tapi ...)
Baiklah saya menyelam dengan saran saya, metode ekstensi:
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);
}
Lalu hubungi:
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
Penting untuk dicatat bahwa ekstensi ini mengembalikan objek tanggal baru , jadi Anda tidak dapat melakukan ini:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Tetapi Anda bisa melakukan ini:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
. Itu karena secara internal, konstruktor tidak melakukan koreksi berbasis kalender kecuali menghitung tahun kabisat untuk bagian tanggal. Yaitu DateTime
adalah implementasi "naif" dalam hal datetime
modul Python .
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Dengan cara ini Anda mempertahankan tanggal Anda, sambil menyisipkan bagian jam, menit, dan detik baru sesuai keinginan Anda.
.AddMilliseconds()
jika diperlukan.
satu liner
var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
akan mengembalikan tanggal todays dengan waktu 4:30:00, ganti DateTime. Sekarang dengan objek tanggal
DateTime adalah tipe yang tidak bisa diubah, jadi Anda tidak bisa berubah .
Namun, Anda dapat membuat instance DateTime baru berdasarkan instance sebelumnya. Dalam kasus Anda, sepertinya Anda memerlukan properti Date, dan Anda kemudian dapat menambahkan TimeSpan yang mewakili waktu dalam sehari.
Sesuatu seperti ini:
var newDt = s.Date + TimeSpan.FromHours(2);
Jika Anda sudah memiliki waktu yang tersimpan di DateTime
objek lain, Anda dapat menggunakan Add
metode ini.
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);
The TimeOfDay
properti adalah TimeSpan
objek dan dapat diteruskan ke Add
metode. Dan karena kita menggunakan Date
properti dateToUse
variabel kita hanya mendapatkan tanggal dan menambahkan rentang waktu.
Solusi paling sederhana:
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);
Dan jika Anda memerlukan Format Tanggal dan Waktu tertentu:
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");
Terjadi pada posting ini karena saya sedang mencari fungsi yang sama ini mungkin bisa melakukan apa yang diinginkan orang itu. Ambil tanggal asli dan ganti bagian waktu
DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
Karena DateTime
tidak dapat diubah, instance baru harus dibuat ketika komponen tanggal perlu diubah. Sayangnya, tidak ada fungsi bawaan untuk mengatur komponen individual aDateTime
instance.
Menggunakan metode ekstensi berikut
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);
}
Anda dapat mengatur DateTime
komponen individual suka
var now = DateTime.Now;
now.SetSecond(0);
Jika Anda memiliki DateTime seperti 2014/02/05 18:19:51 dan hanya ingin 2014/02/05, Anda dapat melakukannya:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
Menambahkan. Tanggal ke tanggal Anda menyetelnya ke tengah malam (00:00).
MyDate.Date
Catatan SQL ekuivalen adalahCONVERT(DATETIME, CONVERT(DATE, @MyDate))
Apa yang membuat metode ini begitu baik adalah bahwa cara mengetiknya cepat dan mudah dibaca. Bonusnya adalah tidak ada konversi dari string.
Yaitu Untuk mengatur tanggal hari ini ke 23:30, gunakan:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
Tentu saja Anda dapat mengganti DateTime. Sekarang atau MyDate dengan tanggal pilihan Anda.
Bahkan, Anda tidak dapat mengubah waktu setelah itu dibuat. Tetapi Anda dapat membuatnya dengan mudah dengan banyak konstruktor: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
Misalnya, jika Anda ingin membuat DateTime yang mengubah Seconds, Anda bisa melakukan ini:
DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
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);
Gunakan Date.Add
dan tambahkan New TimeSpan
dengan waktu baru yang ingin Anda tambahkan
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
Saat Anda membuat DateTime
objek, gunakan konstruktor yang memungkinkan Anda menentukan waktu:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
Jika Anda sudah memiliki DateTime
objek dan ingin mengubah waktu, Anda dapat menambahkan menit, jam, atau detik ke Anda DateTime
menggunakan metode sederhana:
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
Perhatikan bagaimana kita harus "menyimpan" hasil dari setiap pemanggilan metode ke myDateTime
variabel. Ini karenaDateTime
tidak dapat diubah, dan metodenya cukup membuat instance baru dengan tambahan jam / menit / detik.
Jika Anda perlu menambahkan jam dan menit (dan / atau detik) dan waktu yang sama, Anda dapat menyederhanakan kode dengan menambahkan kode TimeSpan
asli DateTime
:
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
Jika Anda ingin menetapkan jam / minue / detik absolut, daripada menambahkan nilai yang ada, Anda dapat menggunakan DateTime
konstruktor yang disebutkan di atas , dan menggunakan kembali nilai untuk tahun / bulan / hari dari sebelumnya:
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
Berikut adalah metode yang dapat Anda gunakan untuk melakukannya untuk Anda, gunakan seperti ini
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
Inilah metodenya, mungkin ada cara yang lebih baik, tapi saya baru saja membahasnya:
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
);
}
Saya baru saja menemukan posting ini karena saya memiliki masalah serupa di mana saya ingin mengatur waktu untuk objek Kerangka Entitas di MVC yang mendapatkan tanggal dari tampilan (datepicker) sehingga komponen waktu adalah 00:00:00 tetapi saya perlu itu menjadi waktu saat ini. Berdasarkan jawaban dalam posting ini saya datang dengan:
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();
Anda dapat menetapkan nilai awal ke DateTime
nilai baru dengan berbagai cara:
Metode ekstensi 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);
}
lalu gunakan ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
menggunakan metode Tambahkan
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
menggunakan Timespan
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
menggunakan nilai awal
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
Apa yang salah dengan metode DateTime.AddSeconds di mana Anda dapat menambah atau mengurangi detik?
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
Anda bisa menambahkan + ve / -ve nilai dalam parameter.
s.Add(new TimeSpan(1, 1, 1));
Bukankah itu memperbaiki masalah Anda ??
Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
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;
}
Gunakan seperti ini:
Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))
ini harus dikembalikan: 2016-06-06 00: 00: 00.000
Solusi terbaik adalah:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
di sini adalah cara ghetto, tetapi ia bekerja :)
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)
tetapi tidak akan merekomendasikannya.