Answers:
您无法更改DateTime值-它是不可变的。但是,您可以将变量更改为具有新值。更改时间的最简单方法是使用相关时间创建一个TimeSpan,并使用DateTime.Date属性:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
现在将是同一日期,但是上午10.30。
请注意,DateTime
忽略夏时制的转换,表示两个方向的“原始”格里高里时间(请参阅DateTime
docs中的“备注”部分)。唯一的例外是.Now
和.Today
:它们检索当前系统时间,该时间反映这些事件的发生。
这种事情促使我启动了Noda Time项目,该项目现已投入生产。它的ZonedDateTime
类型是由“知道” 通过其链接到一个tz
数据库条目。
Add
提供零时间跨度?您的表情等同于s.Date
,但更长...
DateTime
s,(一个用于日期,一个用于时间),您可以这样做:var result = date.Date + time.TimeOfDay;
time
不应该是DateTime
。(我当然会使用Noda Time,但是...)
好吧,我正在提出我的建议,一种扩展方法:
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);
}
然后致电:
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
请务必注意,此扩展名将返回一个新的 date对象,因此您不能这样做:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
但是您可以这样做:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
。这是因为在内部,构造器除了考虑日期部分的year年外,不执行任何基于日历的更正。即DateTime
就Python的datetime
模块而言,这是“天真的”实现。
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
这样,您既可以保留自己的日期,又可以根据自己的喜好插入新的小时,分钟和秒。
.AddMilliseconds()
如果需要也可以做。
如果您已经将时间存储在另一个DateTime
对象中,则可以使用该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);
该TimeOfDay
属性是一个TimeSpan
对象,可以传递给Add
方法。由于我们使用了变量的Date
属性,因此dateToUse
我们只获取日期并添加时间跨度。
由于它DateTime
是不可变的,因此当需要更改日期组件时,必须创建一个新实例。遗憾的是,没有内置功能可以设置DateTime
实例的。
使用以下扩展方法
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
组件,例如
var now = DateTime.Now;
now.SetSecond(0);
如果您有一个类似2014/02/05 18:19:51的DateTime并且只想要2014/02/05,则可以执行以下操作:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
在日期中添加.Date会将其设置为午夜(00:00)。
MyDate.Date
注意等效SQL为CONVERT(DATETIME, CONVERT(DATE, @MyDate))
这种方法之所以如此出色,是因为它既快速键入又易于阅读。一个好处是没有字符串转换。
即要将今天的日期设置为23:30,请使用:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
您当然可以用您选择的任何日期替换DateTime.Now或MyDate。
实际上,创建时间后就无法更改时间。但是您可以使用许多构造函数轻松创建它:https : //docs.microsoft.com/zh-cn/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
例如,如果您想创建一个以秒为单位的日期时间,则只需执行以下操作:
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
并添加New TimeSpan
您要添加的新时间
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
构造DateTime
对象时,请使用允许您指定时间的构造函数:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
如果您已经有一个DateTime
对象并希望更改时间,您可以DateTime
使用简单的方法为您增加分钟,几小时或几秒钟的时间:
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
变量的方法调用的结果。这是因为the DateTime
是不可变的,并且其方法只是创建了添加了额外的小时/分钟/秒的新实例。
如果您需要同时添加小时和分钟(和/或秒),并且可以同时添加时间,则可以通过TimeSpan
在原始位置添加a 来简化代码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
如果要设置绝对小时/分钟/秒,而不是添加到现有值,则可以使用上述DateTime
构造函数,并从更早的年份重用年/月/日的值:
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
这是您可以用来为您做的一种方法,像这样使用
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
这是方法,可能有更好的方法,但我只是提出了一个建议:
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
);
}
//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();
您可以通过DateTime
许多不同的方式将初始值分配给新值:
扩展方式 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);
}
然后使用ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
使用Add方法
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
使用Timespan
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
使用初始值
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
您可以在参数中添加+ ve / -ve值。
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;
}
像这样使用:
Console.WriteLine(DateTime.Now.ClearTimeFrom(eTimeFragment.hours))
这必须返回:2016-06-06 00:00:00.000
最好的解决方案是:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
这是一种贫民窟的方式,但是有效:)
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)
但不推荐。