C# 改变时间

C# 改变时间,c#,datetime,timespan,C#,Datetime,Timespan,我从数据库中获取日期,对于每个日期,我希望更改从从数据库中获取的日期时间开始的时间,直到到达给定的固定时间(Y)。但是,(Y)可能在第二天 例如,如果数据库中的日期为[7/6/2017 5:00:00 AM],而给定的固定时间为10:00 PM,则我希望获得[7/6/2017 10:00:00 PM] 但是,如果固定时间为凌晨02:00,则我希望获得[2017年7月7日凌晨02:00:00](请注意,日期增加了1) 注意:代码正在运行,但我修改了代码,使其更简短、更有意义。因此,可能存在语法或拼

我从数据库中获取日期,对于每个日期,我希望更改从从数据库中获取的日期时间开始的时间,直到到达给定的固定时间(Y)。但是,(Y)可能在第二天

例如,如果数据库中的日期为[7/6/2017 5:00:00 AM],而给定的固定时间为10:00 PM,则我希望获得[7/6/2017 10:00:00 PM]

但是,如果固定时间为凌晨02:00,则我希望获得[2017年7月7日凌晨02:00:00](请注意,日期增加了1)

注意:代码正在运行,但我修改了代码,使其更简短、更有意义。因此,可能存在语法或拼写错误

我的第一个解决方案是这样的:

    private DateTime setTimeForeward(DateTime date) {

        DateTime today = DateTime.ParseExact(FixedTime, "hh:mm tt", CultureInfo.InvariantCulture);

        TimeSpan difference = today.TimeOfDay - date.TimeOfDay;

        return date + difference;

    }
当固定时间是凌晨2:00时,这没有按预期工作。差值变为负值(不是24小时不停地变化),日期为[2017年7月6日02:00:00 AM]

我最终得到了以下代码

   private DateTime setTimeForeward(DateTime date) {

        DateTime today = DateTime.ParseExact(FixedTime "hh:mm tt", CultureInfo.InvariantCulture);

        TimeSpan difference = today.TimeOfDay - date.TimeOfDay;

        if (difference.Hours < 0) {

            difference += new TimeSpan(24, 0, 0);

        }

        return date + difference;

    }
private DateTime settimeforward(日期时间日期){
DateTime today=DateTime.ParseExact(FixedTime“hh:mm tt”,CultureInfo.InvariantCulture);
TimeSpan差=today.TimeOfDay-date.TimeOfDay;
如果(差值0.4小时<0){
差异+=新的时间跨度(24,0,0);
}
返回日期+差异;
}
我不确定我的函数在逻辑上是否正确,我觉得我想得太多了。此外,我不确定是否有更好的方法或内置函数满足我的需求。基本上,我正在寻找一个正确而优雅的解决方案

非常感谢您使用advanced。

您的逻辑几乎正确,但您不应该检查
差异。小时
,因为可能在分钟(甚至秒,如果您稍后更改格式)内存在差异

我调整了您的函数并更改了一些变量名,以使它们更易于理解:

private DateTime SetTimeForward(DateTime originalDate)
{
    TimeSpan newTime = DateTime.ParseExact(FixedTime, 
                                           "hh:mm tt", 
                                           CultureInfo.InvariantCulture).TimeOfDay;
    TimeSpan diff = newTime - originalDate.TimeOfDay;

    if (diff.Ticks < 0)
        diff = diff.Add(new TimeSpan(24, 0, 0));

    return originalDate.Add(diff);
}
或:

  • 如果
    newTime
    等于
    originalDate.TimeOfDay
    ,则当前实现不会更改日期值。即,如果
    原始日期
    2017年6月7日凌晨2:00
    固定时间
    /
    新时间
    02:00
    ,则返回的日期将等于
    原始日期
    。如果这不是您想要的行为,您可能会将
    diff.Ticks<0
    更改为
    diff.Ticks您的逻辑几乎正确,但您不应该检查
    difference.Hours
    ,因为可能以分钟为单位存在差异(如果稍后更改格式,甚至以秒为单位)

    我调整了您的函数并更改了一些变量名,以使它们更易于理解:

    private DateTime SetTimeForward(DateTime originalDate)
    {
        TimeSpan newTime = DateTime.ParseExact(FixedTime, 
                                               "hh:mm tt", 
                                               CultureInfo.InvariantCulture).TimeOfDay;
        TimeSpan diff = newTime - originalDate.TimeOfDay;
    
        if (diff.Ticks < 0)
            diff = diff.Add(new TimeSpan(24, 0, 0));
    
        return originalDate.Add(diff);
    }
    
    或:


  • 如果
    newTime
    等于
    originalDate.TimeOfDay
    ,则当前实现不会更改日期值。即,如果
    原始日期
    2017年6月7日凌晨2:00
    固定时间
    /
    新时间
    02:00
    ,则返回的日期将等于
    原始日期
    。如果这不是您想要的行为,您可能会将
    diff.Ticks<0
    更改为
    diff.Ticks在这个方法中,我使用
    DateTime fixedTime
    表示时间。我真的不在乎它的
    日、月和年

    static DateTime GetClosingTime(DateTime fixedTime, DateTime dbTime)
    {
        var cutoff = new DateTime(dbTime.Year, dbTime.Month, dbTime.Day, fixedTime.Hour, fixedTime.Minute, fixedTime.Second);
        if (dbTime < cutoff)
            return cutoff;
        else
        {
            cutoff = cutoff.AddDays(1);
            return cutoff;
        }
    }
    
    这是我的输出:


    编辑: 基于评论中建议的简化方法:

    static DateTime GetClosingTime(DateTime fixedTime, DateTime dbTime)
    {
        var cutoff = new DateTime(dbTime.Year, dbTime.Month, dbTime.Day, fixedTime.Hour, fixedTime.Minute, fixedTime.Second);
        return dbTime < cutoff ? cutoff : cutoff.AddDays(1);
    }
    
    static DateTime GetClosingTime(DateTime fixedTime,DateTime dbTime)
    {
    var截止=新日期时间(dbTime.Year、dbTime.Month、dbTime.Day、fixedTime.Hour、fixedTime.Minute、fixedTime.Second);
    返回dbTime<截止?截止:截止。添加天数(1);
    }
    
    在这个方法中,我使用
    DateTime fixedTime
    来表示时间。我真的不在乎它的
    日、月和年

    static DateTime GetClosingTime(DateTime fixedTime, DateTime dbTime)
    {
        var cutoff = new DateTime(dbTime.Year, dbTime.Month, dbTime.Day, fixedTime.Hour, fixedTime.Minute, fixedTime.Second);
        if (dbTime < cutoff)
            return cutoff;
        else
        {
            cutoff = cutoff.AddDays(1);
            return cutoff;
        }
    }
    
    这是我的输出:


    编辑: 基于评论中建议的简化方法:

    static DateTime GetClosingTime(DateTime fixedTime, DateTime dbTime)
    {
        var cutoff = new DateTime(dbTime.Year, dbTime.Month, dbTime.Day, fixedTime.Hour, fixedTime.Minute, fixedTime.Second);
        return dbTime < cutoff ? cutoff : cutoff.AddDays(1);
    }
    
    static DateTime GetClosingTime(DateTime fixedTime,DateTime dbTime)
    {
    var截止=新日期时间(dbTime.Year、dbTime.Month、dbTime.Day、fixedTime.Hour、fixedTime.Minute、fixedTime.Second);
    返回dbTime<截止?截止:截止。添加天数(1);
    }
    
    方法稍有不同:

    private DateTime setTimeForeward(DateTime date)
    {
        var targetTimeOfDay = TimeSpan.ParseExact(FixedTime, "hh:mm tt", CultureInfo.InvariantCulture);
    
        if (targetTimeOfDay < date.TimeOfDay)
        {
            date = date.AddDays(1);
        }
    
        return date.Date + targetTimeOfDay;
    }
    
    private DateTime settimeforward(日期时间日期)
    {
    var targetTimeOfDay=TimeSpan.ParseExact(FixedTime,“hh:mm tt”,CultureInfo.InvariantCulture);
    if(targetTimeOfDay
    我从一开始就将目标时间作为TimeSpan,而不是创建DateTime和TimeOfDay(即TimeSpan)。 然后我检查一天的目标时间是否低于要修改的时间,如果是,我添加一天。
    我使用
    date.date+targetTimeOfDay
    作为返回值作为
    date。date
    将返回时间设置为00:00的日期,并且将目标时间添加到其中将已经设置目标小时,而不计算差值。

    稍微不同的方法:

    private DateTime setTimeForeward(DateTime date)
    {
        var targetTimeOfDay = TimeSpan.ParseExact(FixedTime, "hh:mm tt", CultureInfo.InvariantCulture);
    
        if (targetTimeOfDay < date.TimeOfDay)
        {
            date = date.AddDays(1);
        }
    
        return date.Date + targetTimeOfDay;
    }
    
    private DateTime settimeforward(日期时间日期)
    {
    var targetTimeOfDay=TimeSpan.ParseExact(FixedTime,“hh:mm tt”,CultureInfo.InvariantCulture);
    if(targetTimeOfDay
    我从一开始就将目标时间作为TimeSpan,而不是创建DateTime和TimeOfDay(即TimeSpan)。 然后我检查一天的目标时间是否低于要修改的时间,如果是,我添加一天。
    我使用
    date.date+targetTimeOfDay
    作为返回值作为
    date。date
    将返回时间设置为00:00的日期,并且将目标时间添加到其中将已经设置了目标小时,而不计算差异。

    很抱歉,您的解释不是很清楚。@Sach如果您指出什么是错误的,我将很乐意详细解释我的解释完全不清楚。我不想撒谎我恨d