【问题标题】:How to change time in DateTime?如何更改 DateTime 中的时间?
【发布时间】:2010-12-23 23:22:53
【问题描述】:

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

DateTime s = some datetime;

【问题讨论】:

    标签: c# datetime time


    【解决方案1】:

    设置一天的结束:

    date = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);
    

    【讨论】:

      【解决方案2】:

      您可以通过多种不同方式将初始值分配给新的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);
        
      • 使用时间跨度

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

      【讨论】:

      • 不错的扩展方法
      【解决方案3】:

      事实上,时间一经创建就无法更改。 但是您可以使用许多构造函数轻松创建它: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2

      例如,如果你想创建一个 DateTime 变化的 Seconds,你可以这样做:

      DateTime now = DateTime.Now;
      DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
      

      【讨论】:

        【解决方案4】:

        最简单的解决方案:

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

        【讨论】:

          【解决方案5】:

          试试这个

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

          【讨论】:

            【解决方案6】:

            将 .Date 添加到您的日期会将其设置为午夜 (00:00)。

            MyDate.Date
            

            注意等价的SQL是CONVERT(DATETIME, CONVERT(DATE, @MyDate))

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

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

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

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

            【讨论】:

              【解决方案7】:

              使用Date.Add 并添加New TimeSpan 与您要添加的新时间

              DateTime dt = DateTime.Now
              dt.Date.Add(new TimeSpan(12,15,00))
              

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:
                   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

                  【讨论】:

                    【解决方案10】:
                    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") ) ;
                    

                    执行: 今天 = 9/04/15 00:00:00

                    【讨论】:

                      【解决方案11】:

                      您无法更改 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 类型被“感知”by linking it to a tz database entry

                      【讨论】:

                      • s.Date.Add(new TimeSpan(0, 0, 0)) 也应该有效。在几天之间检查时使用它来取消时间。
                      • @user295734:为什么要调用Add 提供零时间跨度?你的表达式相当于s.Date,但更长...
                      • 如果您有 2 个DateTimes,(一个用于日期,一个用于时间)您可以这样做:var result = date.Date + time.TimeOfDay;
                      • @ZacharyYates:是的,尽管我认为你的模型从一开始就被破坏了,time 不应该是DateTime。 (我当然会使用 Noda Time,但是...)
                      • @JonSkeet 同意。只是指出是否有人必须使用他们无法更改的模型(就像我今天早些时候所做的那样)
                      【解决方案12】:

                      如果您有一个像 2014/02/05 18:19:51 这样的 DateTime 并且只想要 2014/02/05,您可以这样做:

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

                      【讨论】:

                        【解决方案13】:

                        最好的解决办法是:

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

                        【讨论】:

                        • 起初我认为这是错误的,但是 if 将结果分配给 DateTime 对象是有意义的。虽然这不是最好的解决方案。它要求您知道当前的时间部分以便进行正确的计算,同时获取日期的日期部分并添加最好的。
                        • 绝对不是“最好的”。远非可读且重复使用幻数。
                        【解决方案14】:

                        我更喜欢这个:

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

                        【讨论】:

                          【解决方案15】:
                          s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
                          

                          通过这种方式,您可以保留日期,同时根据自己的喜好插入新的小时、分钟和秒部分。

                          【讨论】:

                          • @Webleeuw 当然,ArgumentOutOfRangeException 的可能性很小,具体取决于附加值。这是一个证明这一点的Pex 谜题。
                          • 并且根据使用情况,如果需要也可以做.AddMilliseconds()
                          • @lifebalance Pex 链接不再有效,您能详细说明问题吗?
                          【解决方案16】:
                          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);
                          

                          【讨论】:

                            【解决方案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 方法。由于我们使用了dateToUse 变量的Date 属性,我们只得到了日期并添加了时间跨度。

                            【讨论】:

                              【解决方案18】:

                              一个班轮

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

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

                              【讨论】:

                                【解决方案19】:
                                //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();
                                

                                【讨论】:

                                  【解决方案20】:

                                  发生在这篇文章上,因为我正在寻找可以满足这个人想要的相同功能。取原来的日期,替换掉时间部分

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

                                  【讨论】:

                                    【解决方案21】:

                                    我刚刚看到这篇文章,因为我有一个类似的问题,我想在 MVC 中为从视图(日期选择器)获取日期的实体框架对象设置时间,因此时间组件是 00:00:00但我需要它是当前时间。根据这篇文章中的答案,我想出了:

                                    myEntity.FromDate += DateTime.Now.TimeOfDay;
                                    

                                    【讨论】:

                                      【解决方案22】:

                                      这不能解决你的问题吗?

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

                                      【讨论】:

                                        【解决方案23】:
                                          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:更重要的是,您现在已将分配添加回 s(对 s.Add(...) 的调用除外)。
                                        • @Jon:我吸取了教训。感谢您的好意和时间。我是认真的。
                                        【解决方案24】:

                                        这是一个你可以用来为你做的方法,像这样使用它

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

                                        【讨论】:

                                          【解决方案25】:

                                          好的,我正在深入研究我的建议,一种扩展方法:

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

                                          需要注意的是,这个扩展返回一个new日期对象,所以你不能这样做:

                                          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) 基本相同。这是因为在内部,构造函数不执行任何基于日历的更正,除了为日期部分考虑闰年。 IE。 DateTime 是 Python 的 datetime 模块的“幼稚”实现。
                                          【解决方案26】:

                                          当您构造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 变量。这是因为DateTime 是不可变的,它的方法只是创建新实例并添加额外的小时/分钟/秒。

                                          如果您需要同时添加小时和分钟(和/或秒),您可以通过将TimeSpan 添加到原始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 方法进行加减法
                                          【解决方案27】:

                                          这是一个贫民区的方式,但它有效:)

                                          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) 但不推荐。
                                          【解决方案28】:

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

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

                                          类似这样的:

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

                                          【讨论】:

                                            【解决方案29】:

                                            可以添加或减去秒数的 DateTime.AddSeconds 方法有什么问题?

                                            【讨论】:

                                            • 不仅如此,而且听起来无论如何也不能回答这个问题。我怀疑 OP 想要一个具有相同日期但特定时间的 DateTime - 这将相对仅使用 AddSeconds 就很难做到。
                                            猜你喜欢
                                            • 2020-12-25
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2015-08-04
                                            • 2011-05-26
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多