C# 改变时间
我从数据库中获取日期,对于每个日期,我希望更改从从数据库中获取的日期时间开始的时间,直到到达给定的固定时间(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) 注意:代码正在运行,但我修改了代码,使其更简短、更有意义。因此,可能存在语法或拼写错误 我的第一个解决方案是这样的: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) 注意:代码正在运行,但我修改了代码,使其更简短、更有意义。因此,可能存在语法或拼
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