下面的c#代码应该返回一个TimeSpan,该TimeSpan指示事件的当前时间和下一次发生之间有多长时间,该事件应该发生在凌晨5点它必须处理在凌晨5点之前或之后调用代码的情况

代码设法在凌晨4点到5点之间在我们的服务器上返回负延迟(+1GMT),这是我无法理解的.有人知道原因是什么吗?

TimeSpan EverydayAt(int hourOfDay)
{
    DateTimeOffset now = DateTimeOffset.UtcNow;
    DateTimeOffset nextTime = now.Date.AddDays(now.Hour < hourOfDay ? 0 : 1).AddHours(hourOfDay);
    TimeSpan delay = nextTime - now;
    return delay;
}

推荐答案

有人知道解释是什么吗?

阐述这个问题就是从这条线上说出来的.

now.Date.AddDays(now.Hour < hourOfDay ? 0 : 1).AddHours(hourOfDay);

这是一个DateTime对象,您并不知道,您实际上是在隐式转换到DateTimeOffset对象nextTime.

创建的这nextTime个对象将具有自"our servers(+1GMT)"以来的1小时的Offset.

因此,基本上,接近凌晨5点(1小时或更短)的时间将生成当天的DateTimeOffset对象,Offset为1小时,与now(当天的DateTimeOffset对象,Offset为0小时)进行比较.

Alternative solution:

就是把它转换回DateTimeOffset加上零Offset

int hourOfDay = 15;
DateTimeOffset now = DateTimeOffset.UtcNow;
DateTimeOffset nextTime = new DateTimeOffset(now.Date.AddDays(now.Hour < hourOfDay ? 0 : 1).AddHours(hourOfDay), TimeSpan.Zero);
TimeSpan delay = nextTime - now;

Additional Info

Conversions from DateTime to DateTimeOffset

DateTimeOffset struct 提供了两种等价的方式来执行 DateTime到DateTimeOffset的转换适用于大多数 转换:

  • DateTimeOffset构造函数,它基于DateTime值创建新的DateTimeOffset对象.
  • 隐式转换运算符,它允许您将 DateTime值添加到DateTimeOffset对象.

隐式转换是指您在该行上所做的操作.

但是,对于Kind属性为 DateTimeKind.未指定,这两种转换方法会产生 其偏移量为本地时区的DateTimeOffset值.

Csharp相关问答推荐

如何打印已添加到List的Linq值,而不是C#中的:System.Collections.Generic.List ' 1[System.Int32]?

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

更改对象的旋转方向

如何从HttpContext获取请求正文

无法创建';';类型的';DbContext';.异常';无法解析类型';Microsoft.EntityFrameworkCore.DbContextOptions`1[Comm的服务

在调整大小的控件上绘制

Docker Container中的HttpRequest后地址不可用

net中从位图获取坐标和绘制折线

如何在用户在线时限制令牌生成?

JsonSchema.Net删除假阳性判断结果

使用System.Text.Json进行序列化时发生StackOverflow异常

如何更改新创建的实例的变量?

Content WithTargetPath实际上是有效的MSBuild项吗?

JSON串行化程序问题.SQLite中的空值

Visual Studio 17.8.0制表符自动完成问题--三缩进

FakeItEasy自动嘲弄内容

ASP.NET核心8:app.UseStaticFiles()管道执行顺序

最小API定义的Swagger标头参数

我应该使用IMhemyCache来存储承载令牌,还是应该为Azure函数中的401个错误实施Polly重试策略?