如何在DateTime中更改时间?

时间:2009-12-07 10:47:18

标签: c# datetime time

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

DateTime s = some datetime;

28 个答案:

答案 0 :(得分:531)

您无法更改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

答案 1 :(得分:89)

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

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

请注意,此扩展程序会返回日期对象,因此您无法执行此操作:

DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);

但你可以这样做:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);

答案 2 :(得分:61)

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

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

答案 3 :(得分:27)

一个班轮

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

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

答案 4 :(得分:20)

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

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

这样的事情:

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

答案 5 :(得分:14)

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

答案 6 :(得分:11)

最简单的解决方案:

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

答案 7 :(得分:8)

发生在这篇文章上,因为我正在寻找相同的功能,这可能会做到这个人想要的。取原始日期并替换时间部分

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

答案 8 :(得分:8)

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

答案 9 :(得分:3)

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

例如,如果您要创建一个以秒为单位的DateTime,则可以执行以下操作:

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

答案 10 :(得分:3)

如果您有像2014/02/05 18:19:51这样的日期时间,并且只想要2014/02/05,那么您可以这样做:

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

答案 11 :(得分:3)

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

MyDate.Date

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

这种方法的优点在于它既快速输入又易于阅读。奖励是没有来自字符串的转换。

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

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

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

答案 14 :(得分:2)

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

答案 15 :(得分: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
        );
}

答案 16 :(得分:1)

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

myEntity.FromDate += DateTime.Now.TimeOfDay;

答案 17 :(得分: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();

答案 18 :(得分:0)

我更喜欢这个:

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

答案 19 :(得分:0)

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

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

答案 20 :(得分: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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

这不能解决你的问题吗?

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

答案 24 :(得分:-1)

最佳解决方案是:

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

答案 25 :(得分:-1)

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

答案 26 :(得分:-1)

试试这个

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

答案 27 :(得分:-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));