ASP.NET Core 按用户设置时区?

Rem*_*ima 5 asp.net datetime date asp.net-core

我有一个在全球范围内使用的网络应用程序。

所有日期和时间都以 UTC 形式存储,并且当前显示为 UTC,并带有一个小页脚,说明“所有时间和日期均以 UTC 形式显示”。

显然,大多数人不知道也不关心 UTC,所以我想打电话someDate.ToLocalTime()- 当用户的系统设置为当地国家并且浏览器传递该信息时,这种方法效果很好。

然而,有时/经常,用户系统设置为美国或其他默认值并显示错误的时间。在本例中,我可以显示可用时区的列表,例如:

<form id="selectTimezone" asp-controller="Account" asp-action="SetTimezone" asp-route-returnUrl="@Context.Request.Path" asp-area="" method="post" role="form">
    <div class="form-group form-group-sm">
        <label class="control-label">@Localiser["Timezone:"]</label>
        <select name="timezoneId" class="form-control" asp-for="@TimeZoneInfo.Local.Id">
            @foreach (var timeZone in TimeZoneInfo.GetSystemTimeZones())
            {
                <option value="@(timeZone.Id)">@timeZone.DisplayName (@timeZone.StandardName)</option>
            }
        </select>
        <button type="submit" class="btn btn-primary btn-sm" style="margin-bottom: 0px;">@SharedLocaliser["Set Language"]</button>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

我的问题是,我找不到它 - 我可以设置会话范围的默认时区吗?

或者我是否需要将其存储在用户的帐户中,然后将其读入 cookie 并通过每次向 UTC 添加所需的秒数来处理它?

就像是:

TimeZoneInfo.ConvertTime(someDate, myTimeZoneId);
Run Code Online (Sandbox Code Playgroud)

小智 0

在大多数情况下,将所有日期时间数据存储在 UTC 中,并在用户数据库中为每个用户保留一个 TimeZoneId,然后将 UTC 转换为首选(用户想要的)时区,应该可以正常工作。作为用户首选项的一部分,用户可以选择更改此 TimeZoneId,这将帮助用户在需要时更改它。如果您想更进一步,还可以存储一列时区规则更改,并单独为这些情况编写规则更新例程。迪诺·埃斯波西托 (Dino Esposito)乔恩·斯基特 (Jon Skeet)撰写的这些文章有更多内容可供探讨。

关于 .NET core,这两篇文章 - .NET Core 的跨平台时区和 Matt 的最新博客.NET 6 中的日期、时间和时区增强功能将帮助您决定策略。如果您的应用程序确实需要精确且多功能的基于日期、时间和时区的演示,那么请使用Noda Time来实践。