如何在DateTime中更改时间?


353

如何仅更改DateTime变量“ s”中的时间?

DateTime s = some datetime;

Answers:


598

您无法更改DateTime值-它是不可变的。但是,您可以将变量更改为具有新值。更改时间的最简单方法是使用相关时间创建一个TimeSpan,并使用DateTime.Date属性:

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

s 现在将是同一日期,但是上午10.30。

请注意,DateTime忽略夏时制的转换,表示两个方向的“原始”格里高里时间(请参阅DateTimedocs中的“备注”部分)。唯一的例外是.Now.Today:它们检索当前系统时间,该时间反映这些事件的发生。

这种事情促使我启动了Noda Time项目,该项目现已投入生产。它的ZonedDateTime类型是由“知道” 通过其链接到一个tz数据库条目


11
s.Date.Add(new TimeSpan(0,0,0))也应该起作用。在两天之间进行检查时,使用它可以使时间无效。
智者酸奶

8
@ user295734:为什么要调用Add提供零时间跨度?您的表情等同于s.Date,但更长...
Jon Skeet 2012年

忘了纠正它,在我将其放入代码中后实现了,将其设置为零(我最初在搜索什么)。但我只是想展示如何在一个线时间设置,如果没有设置为0
酸奶智者

3
如果您有2 DateTimes,(一个用于日期,一个用于时间),您可以这样做:var result = date.Date + time.TimeOfDay;
Zachary Yates 2013年

2
@ZacharyYates:是的,尽管我认为到那时您的模型已经损坏了,time不应该是DateTime。(我当然会使用Noda Time,但是...)
Jon Skeet 2013年

100

好吧,我正在提出我的建议,一种扩展方法:

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

6
这基本上与相同Datetime.Today.Add(time.TimeOfDay)。这是因为在内部,构造器除了考虑日期部分的year年外,不执行任何基于日历的更正。即DateTime就Python的datetime模块而言,这是“天真的”实现。
ivan_pozdeev 2014年

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

这样,您既可以保留自己的日期,又可以根据自己的喜好插入新的小时,分​​钟和秒。


@Webleeuw当然,根据添加的值,可能会出现ArgumentOutOfRangeException的可能性很小。这是一个证明这一点的Pex拼图。
生命平衡

并且根据使用情况,.AddMilliseconds()如果需要也可以做。
Broots Waymb '17

39

一支班轮

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

会以4:30:00的时间带回今天的日期,将DateTime.Now替换为任何日期对象


22

DateTime是不可变的类型,因此您无法更改

但是,您可以基于先前的实例创建一个新的DateTime实例。在您的情况下,听起来好像需要Date属性,然后可以添加代表一天中时间的TimeSpan。

像这样:

var newDt = s.Date + TimeSpan.FromHours(2);

17

如果您已经将时间存储在另一个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我们只获取日期并添加时间跨度。


15

最简单的解决方案:

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

如果您需要特定的日期和时间格式:

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

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

执行:今天= 15年9月4日00:00:00


8

碰巧在这篇文章中,我一直在寻找可以实现此人想要的功能的功能。取原始日期并替换时间部分

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");

4

由于它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);

3

如果您有一个类似2014/02/05 18:19:51的DateTime并且只想要2014/02/05,则可以执行以下操作:

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)

3

在日期中添加.Date会将其设置为午夜(00:00)。

MyDate.Date

注意等效SQL为CONVERT(DATETIME, CONVERT(DATE, @MyDate))

这种方法之所以如此出色,是因为它既快速键入又易于阅读。一个好处是没有字符串转换。

即要将今天的日期设置为23:30,请使用:

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

您当然可以用您选择的任何日期替换DateTime.Now或MyDate。





1

构造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

使用AddXXX方法进行加法和减法
克里斯·里奇纳

1

这是您可以用来为您做的一种方法,像这样使用

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

1

我刚刚遇到了这篇文章,因为我有一个类似的问题,我想为MVC中的Entity Framework对象设置时间,该对象从视图(日期选择器)获取日期,因此时间部分为00:00:00,但我需要现在是当前时间。根据这篇文章的答案,我想到了:

myEntity.FromDate += DateTime.Now.TimeOfDay;

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

1

您可以通过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);

0

DateTime.AddSeconds方法有什么问题,您可以在其中添加或减去秒?


不仅如此,而且听起来还不能回答任何问题。我怀疑OP希望用相同的日期,但具体时间的DateTime -这将是比较难只是用AddSeconds做。
乔恩·斯基特

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

@Jon:我评论了这一行。用户需要在使用此代码之前分配一些值。
萨尔(Saar)

@Saar:更重要的是,您现在已将分配添加回s(对s.Add(...)的调用除外)。
乔恩·斯基特

@Jon:我学到了教训。感谢您的好意和时间。我真心的。
萨尔(Saar)

0

这不能解决您的问题吗?

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

0

我更喜欢这样:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);

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;

        }

像这样使用:

Console.WriteLine(DateTime.Now.ClearTimeFrom(eTimeFragment.hours))

这必须返回:2016-06-06 00:00:00.000


-1

最好的解决方案是:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);

1
起初我认为这是错误的,但是如果将结果分配给DateTime对象,这是有道理的。虽然这不是最佳解决方案。它要求您知道当前的时间部分,以便进行正确的计算,同时获取日期的日期部分并添加最佳部分。
ThunderGr 2013年

1
绝对不是“最好的”。远非易读且反复使用幻数。
BartoszKP 2015年

-1

试试这个

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;

-5

这是一种贫民窟的方式,但是有效:)

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)但不推荐。
迈克,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.