Yanıtlar:
Bir DateTime değerini değiştiremezsiniz - değişmez. Ancak, değişkeni yeni bir değere sahip olacak şekilde değiştirebilirsiniz. Bunu sadece zamanı değiştirmek için yapmanın en kolay yolu, ilgili zamana sahip bir TimeSpan oluşturmak ve DateTime.Date özelliğini kullanmaktır:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
şimdi aynı tarihte olacak, ancak saat 10.30'da.
DateTime
Her iki yönde "naif" Gregoryen zamanı temsil eden yaz saati geçişlerini göz ardı ettiğini unutmayın ( DateTime
dokümanlardaki Açıklamalar bölümüne bakın ). Tek istisna vardır .Now
ve .Today
: bunlar ortaya çıktıkça bu olayları yansıtan geçerli sistem saati almak.
Bu, beni şimdi üretime hazır olan Noda Time projesini başlatmaya motive eden bir şey . Onun ZonedDateTime
tipi "farkında" yapıldığı bir bağlayarak tz
veri tabanı girişi .
Add
sıfır zaman aralığı sağlamayı çağırıyorsunuz ? İfadeniz eşdeğer s.Date
, ancak daha uzun ...
DateTime
s'niz varsa (bir tarih ve bir saat için) bunu yapabilirsiniz:var result = date.Date + time.TimeOfDay;
time
olmamalı olduğunu iddia etsem de DateTime
. (Elbette Noda Time'ı kullanırdım, ama ...)
Tamam, benim önerim, bir uzatma yöntemi ile dalış:
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);
}
Sonra ara:
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
Bu uzantının yeni bir tarih nesnesi döndürdüğüne dikkat etmek önemlidir , bu nedenle bunu yapamazsınız:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Ancak bunu yapabilirsiniz:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
. Çünkü dahili olarak, yapıcı, tarih bölümü için bir artık yılı hesaplamak dışında herhangi bir takvim tabanlı düzeltme yapmaz. Yani DateTime
Python'un datetime
modülü açısından "naif" bir uygulamadır .
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Bu şekilde, beğeninize yeni bir saat, dakika ve saniye parçası eklerken tarihinizi korursunuz.
.AddMilliseconds()
gerekirse de yapabilirsiniz .
bir astar
var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
Bugünün tarihini 4:30:00 ile geri getirecek, DateTime.Now yerine herhangi bir tarih nesnesiyle
DateTime değişmez bir tiptir, bu yüzden değiştiremezsiniz .
Ancak, önceki örneğinize dayalı olarak yeni bir DateTime örneği oluşturabilirsiniz. Sizin durumunuzda, Date özelliğine ihtiyacınız olduğu anlaşılıyor ve günün saatini temsil eden bir TimeSpan ekleyebilirsiniz.
Bunun gibi bir şey:
var newDt = s.Date + TimeSpan.FromHours(2);
Zaten başka bir DateTime
nesnede depolanmış zamanınız varsa Add
yöntemi kullanabilirsiniz .
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);
TimeOfDay
Özelliği a, TimeSpan
nesne ve geçirilebilir Add
yöntem. Ve değişkenin Date
özelliğini kullandığımız dateToUse
için sadece tarihi alırız ve zaman aralığını ekleriz.
Bu yazı muhtemelen bu adam istediğini yapabilirdi aynı işlevselliği arıyordum oldu. Orijinal tarihi alın ve saat bölümünü değiştirin
DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
Beri DateTime
değişmez, yeni örneği bir tarih bileşeni değişmesi gerekirse oluşturulan gerekmektedir. Ne yazık ki, bir bileşenin bireysel bileşenlerini ayarlamak için yerleşik bir işlevsellik yokturDateTime
örneğin .
Aşağıdaki uzantı yöntemlerini kullanma
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);
}
DateTime
gibi bileşenleri tek tek ayarlayabilirsiniz
var now = DateTime.Now;
now.SetSecond(0);
2014/02/05 18:19:51 gibi bir DateTime'ınız varsa ve sadece 2014/02/05 istiyorsanız, bunu yapabilirsiniz:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
Tarihinize tarih eklemek, gece yarısına (00:00) ayarlanır.
MyDate.Date
Not Eşdeğer SQLCONVERT(DATETIME, CONVERT(DATE, @MyDate))
Bu yöntemi bu kadar iyi yapan şey hem yazmanın hızlı hem de okunması kolay olmasıdır. Bonus, dizelerden dönüşüm olmamasıdır.
Yani Bugünün tarihini 23: 30'a ayarlamak için şunu kullanın:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
Tabii ki DateTime.Now veya MyDate'i istediğiniz herhangi bir tarihle değiştirebilirsiniz.
Aslında, oluşturulduktan sonra saati değiştiremezsiniz. Ancak birçok kurucu ile kolayca oluşturabilirsiniz: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
Örneğin, Saniye cinsinden bir DateTime oluşturmak istiyorsanız, bunu yapabilirsiniz:
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);
Date.Add
Eklemek New TimeSpan
istediğiniz yeni saatle a kullanın ve ekleyin
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
Eğer inşa zaman DateTime
nesne, zamanı belirlemenizi sağlar bir kurucu kullanabilirsiniz:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
Zaten bir DateTime
nesneniz varsa ve saati değiştirmek istiyorsanız, DateTime
basit yöntemleri kullanarak dakika, saat veya saniye ekleyebilirsiniz :
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
myDateTime
Değişken için yapılan her yöntem çağrısının sonucunu nasıl "kaydetmemiz" gerektiğine dikkat edin . Bunun nedeni DateTime
, değişmez olması ve yöntemlerinin, fazladan saat / dakika / saniye ekleyerek yeni örnekler oluşturmasıdır.
Hem saat hem de dakika (ve / veya saniye) ve aynı zamanda eklemeniz TimeSpan
gerekiyorsa, DateTime
bunun yerine orijinaline a ekleyerek kodu basitleştirebilirsiniz :
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
Varolan değerlere eklemek yerine mutlak saat / dakika / saniye ayarlamak istiyorsanız, yukarıda belirtilen yapıcıyı kullanabilir DateTime
ve yıl / ay / gün değerlerini daha önce yeniden kullanabilirsiniz:
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
İşte sizin için yapmak için kullanabileceğiniz bir yöntem, böyle kullanın
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
İşte yöntem, muhtemelen daha iyi bir yol var, ama ben sadece bu kadar çırpılmış:
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
);
}
Ben sadece bu yazı rastladım çünkü zaman bileşeni 00:00:00 böylece MVC bir görünümden (datepicker) tarih alır bir Entity Framework nesnesi için zaman ayarlamak istedim benzer bir sorun vardı ama ihtiyacım var şimdiki zaman olmak. Bu yazıdaki cevaplara dayanarak:
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();
Yeni bir DateTime
değere birçok farklı yolla bir başlangıç değeri atayabilirsiniz :
Genişletme yöntemi 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);
}
sonra kullanarak ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
Add yöntemlerini kullanarak
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
Timespan'ı kullanma
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
başlangıç değerini kullanma
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
Saniyeler ekleyebileceğiniz veya alt özet ekleyebileceğiniz DateTime.AddSeconds yönteminde sorun nedir?
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
parametreye + ve / -ve değerleri ekleyebilirsiniz.
s.Add(new TimeSpan(1, 1, 1));
Bu sorunlarınızı düzeltmiyor mu?
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;
}
Bunun gibi kullanın:
Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))
bunun geri dönmesi gerekiyor: 2016-06-06 00: 00: 00.000
En iyi çözüm:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
İşte bir getto yolu, ama işe yarıyor :)
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)
ama bunu tavsiye etmem.