如何在DateTime中更改时间?

San*_*osh 330 c# time datetime

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

DateTime s = some datetime;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 561

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

DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
Run Code Online (Sandbox Code Playgroud)

s 现在将是同一天,但是在上午10点30分.

请注意,DateTime忽略夏令时转换,表示两个方向上的"天真"格里高利时间(请参阅DateTime文档中的备注部分).唯一的例外是.Now.Today:它们检索所出现的哪些反映了这些事件的当前系统时间.

这是促使我启动Noda Time项目的一种方式,该项目现已投入生产.通过将其链接到数据库条目,可以ZonedDateTime "识别" 它的类型.tz

  • s.Date.Add(新的TimeSpan(0,0,0))也应该有效.在几天之间检查时使用它来消除时间. (9认同)
  • @ user295734:为什么你会调用提供零时间的"添加"?你的表达式相当于`s.Date`,但更长...... (8认同)
  • 如果你有2个`DateTime`s,(一个用于日期,一个用于时间),你可以这样做:`var result = date.Date + time.TimeOfDay;` (3认同)
  • @ZacharyYates:是的,虽然我认为在那一点上你的模型会被打破,而'time`不应该是`DateTime`.(我当然会使用野田时间,但......) (2认同)

jos*_*ley 94

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

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);
}
Run Code Online (Sandbox Code Playgroud)

然后打电话:

DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
Run Code Online (Sandbox Code Playgroud)

请务必注意,此扩展会返回一个新的日期对象,因此您无法执行此操作:

DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Run Code Online (Sandbox Code Playgroud)

但你可以这样做:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Run Code Online (Sandbox Code Playgroud)

  • 这与`Datetime.Today.Add(time.TimeOfDay)`基本相同.这是因为在内部,构造函数不会执行任何基于日历的更正,除非考虑日期部分的闰年.即`DateTime`就Python的`datetime`模块而言是一个"天真"的实现. (5认同)

Web*_*euw 69

s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Run Code Online (Sandbox Code Playgroud)

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


小智 33

一个班轮

var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ann 22

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

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

像这样的东西:

var newDt = s.Date + TimeSpan.FromHours(2);
Run Code Online (Sandbox Code Playgroud)


小智 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);
Run Code Online (Sandbox Code Playgroud)

TimeOfDay属性是一个TimeSpan对象,可以传递给该Add方法.由于我们使用变量的Date属性,dateToUse我们只得到日期并添加时间跨度.


Mr *_*bix 14

最简单的解决方案

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);
Run Code Online (Sandbox Code Playgroud)

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

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


小智 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") ) ;
Run Code Online (Sandbox Code Playgroud)

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


Kni*_*ins 9

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

MyDate.Date
Run Code Online (Sandbox Code Playgroud)

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

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

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

DateTime.Now.Date.AddHours(23).AddMinutes(30)
Run Code Online (Sandbox Code Playgroud)

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


Rez*_*abi 9

您可以通过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);
    }
Run Code Online (Sandbox Code Playgroud)

然后使用ChangeTime

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
Run Code Online (Sandbox Code Playgroud)


小智 8

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

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
Run Code Online (Sandbox Code Playgroud)


小智 5

由于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);
}
Run Code Online (Sandbox Code Playgroud)

您可以设置单独的DateTime组件,例如

var now = DateTime.Now;

now.SetSecond(0);
Run Code Online (Sandbox Code Playgroud)