ASP.Net DateTime 戏剧

问题描述

这看起来很基础,但我一直在研究这个(这里,其他网站,Microsoft 文档等)并研究了几个月。我只是没有遇到问题。

我有一个经常使用 DateTime 的程序。它在去年秋天夏令时之前效果很好。然后一切都停止正常运行 - 现在似乎一切都结束了一个小时。我用 DateTime.Now.AddHours() 补偿,但这只是创可贴。

我尝试过 DateTimeOffset.Now、DateTime.ToLocalTime、DateTime.UTCNow 等。它只是不会使用系统时间或补偿。

我在太平洋标准时间,如果这是另一种接近它的方式,没有人会在这个时区之外使用这个网站。

有人对为什么会发生这种情况有任何想法吗?整个程序都在做,但我会给出其中一个领域的一些片段。

    <table class="table-bordered" id="table_lunch" style="width:15em;">
        @*populate the table with only those breaks that lack a TimeCleared value*@
        @if (ViewBag.Lunches != null)
        {
            foreach (var item in modelOrdered)
            {
                if (DateTimeOffset.Now.AddHours(-1) >= item.LunchTime.AddMinutes(-1) && DateTimeOffset.Now.AddHours(-1) <= item.LunchTime.AddMinutes(1))
                {
                    if (item.EmpSent == false)
                    {
                        <tr class="listTime">
                            @*Make each name clickable - deletes the lunch*@
                            <td class="LunchIdNumber">
                                @if (item.LongerLunch == false && item.Double == false)
                                {
                                    <input type="hidden" class="hiddenLunchID" value="@item.LunchID" />
                                    <a href="Javascript:;" class="empNameLunch" style="color:black">@item.Employee.displayName</a>

解决方法

没有 minimal,reproducible example 真的很难回答你的问题,但我会尝试一下。

在您的代码中,通过使用 DateTimeOffset.Now,您将使用系统的本地时区作为比较的基础。相反,您应该在进行比较之前获取特定时区的时间:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
DateTimeOffset now = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow,tzi);

然后您可以在比较中使用 now,它会反映太平洋时区的当前时间,无论是在夏令时生效还是未生效时。

请注意,我从您所描述的问题、评论和症状中推断出一些信息:

  • 您的 item.LunchTimeDateTime 类型。如果它实际上是 DateTimeOffset 类型,那么无论时区如何,都会正确进行比较。换言之,DateTime 比较基于所显示的日期和时间,而 DateTimeOffset 比较基于等效的 UTC 时间戳。

  • 您的服务器是 Windows 服务器。我相信 GoDaddy 只将 Plex 用于它的 Windows 托管(从我搜索他们的文档中收集到的信息)。

  • 因为你说在去年秋天之前一切正常,我想你的意思是它一直工作到夏令时结束。换句话说,虽然太平洋时间是 UTC-7,但您从 DateTimeOffset.Now 获得的值是您所期望的,但是当太平洋时间返回 UTC-8 时,您仍然像以前一样获得具有 UTC-7 偏移量的值。

如果最后一点是正确的,那么您的服务器可能设置为 Arizona 而不是太平洋时间。由于 GoDaddy 是一家位于亚利桑那州的公司,因此这是有道理的。

可能会也可能不会更改系统的时区,具体取决于 GoDaddy 公开的托管环境的数量。我可以从 Plesk 的文档中看到他们确实提供了日期和时间设置面板 - 但我不确定 GoDaddy 是否向您公开它。

同样,我的建议是忽略系统本地时区,不要尝试更改它。相反,更改您的代码以使用特定的时区,如图所示。如果可以在整个应用程序中更轻松地使用它,请将其放在代码中某个位置的辅助函数中。