2017-09-23 165 views
0

当前记录正在以记录实际进入系统时的UTC存储。在夏时制的国际处理中准确记录当地的记录时间

我的任务是现在允许用户输入过去事件的记录,以及事件发生时这些事件在本地发生的时间。

我的困境是,不仅有不同的时区,而且在一年中的某些时段还有夏令时观察。

以图表格式准确报告个人事件是关键,所以我的问题是,如何准确地向用户报告正确的日期?因为人们迁移到不同的时区,同一个人可能会在不同的世界地点重新获得相同的日期和时间。

存储和显示这些事件给用户的最好方法是什么? 表单数据通过asp.net c#web应用程序输入并存储在SQL Server数据库中。输入的时间和日期将始终是用户本地的日期和时间。

+0

以UTC保存它们。您没有指定用户如何添加这些日期以及需要显示它们的位置(Web应用程序,桌面应用程序等)。 –

+0

嗨,对不起......这些正在使用c#asp.net在Web应用程序中显示。 – cloudseeker

+0

我的建议是始终使用UTC日期来存储和交换数据。当您需要显示它们(或获取新日期)时,最好的选择是完全依赖客户端技术(javascript),它将使用当前用户时区信息进行日期显示和创建。 –

回答

1

对于过去的单发事件,最简单的解决方案是使用SQL Server中的datetimeoffset字段进行存储,并在.NET中使用相应的DateTimeOffset类型。 datetimeoffset值的日期和时间部分反映了事件的本地时间,偏移量反映了当地时间在此时UTC或前后的距离。欲了解更多信息,请参阅DateTime vs DateTimeOffset

此方法不需要任何额外的DST补偿。由于这只是单一事件,所以偏移量包含标准时间和当时有效的任何适用的夏令时。

棘手的部分将从您的MVC网站的用户收集准确的DateTimeOffset输入值。目前,DateTimeOffset没有简单的内置控制。相反,您需要提供DateTime的输入框,并单独显示可能的偏移量的下拉列表。我有一些演示代码here,将告诉你如何生成该列表。使用它来填充下拉列表,并且可以让用户选择偏移量。希望这将最终融入到ASP.NET Core中,所以你可以直接绑定到DateTimeOffset。关于aspnet/Mvc#6648的一些讨论。