这个问题专门涉及未来的日期和时间(对于过去的值,UTC 无疑是首选)。
我想知道是否有人对在 MySQL 数据库中保存未来日期和时间的“最佳”方法有建议(或者一般情况下),特别是在列可以保存不同时区时间的情况下。考虑到时区规则可能会改变 UTC 可能不是最好的选择。
到目前为止,我发现的最可行的选择是将其与位置一起保存为该位置当地时间的文本(例如“美国/*”)。不幸的是,这个解决方案可能更容易出现数据损坏,而且计算起来肯定不太方便。
有人能想出更好的办法吗?
提前致谢
这是一个与this 类似的问题。
我真的很想在我的应用程序中将日期时间存储为本地时间而不是 UTC(这被认为是最佳实践)。在应用程序中,我发生了许多事件,每个事件都分配给给定的位置。当我向用户显示它们时,我总是想显示事件的当地时间。IE:
====================================================================================
Event time (with TZ) | As UTC | As local time | To be displayed |
====================================================================================
2014-01-15 22:30 GMT | 2014-01-15 22:30 | 2014-01-15 22:30 | 2014-01-15 22:30 |
2014-01-15 23:30 GMT+1 | 2014-01-15 22:30 | 2014-01-15 23:30 | 2014-01-15 23:30 |
2014-01-16 00:30 GMT+2 | 2014-01-15 22:30 | 2014-01-16 00:30 | 2014-01-16 00:30 |
====================================================================================
Run Code Online (Sandbox Code Playgroud)
如果我决定以 UTC 格式存储事件时间:
显示它们将很困难(因为对于每个事件,我都需要该事件的时区并格式化该时区的日期)。
查询它们将非常困难(即,如果我想显示当地时间 2014-01-15 发生的所有事件,我需要每个事件将该事件的时间与该事件中“2014-01-15”的含义进行比较时区。不确定这在 SQL 中是否可能......)
如果我决定将事件时间存储为当地时间:
由于在应用程序中的绝大多数情况下,我对当地时间(通常显示所谓的“电视时间”)感兴趣,并且没有很多情况我创建新的日期时间对象(为此我需要位置时区),我相信在这种情况下将日期时间保存为当地时间是合理的。
你认为是吗?存储当地时间还有哪些其他缺点?
预先感谢您的关注和帮助。
我正在研究一个项目,该项目有很多时间根据这些时间表安排和执行任务.
我只是想知道是否有一种更简单的方法来测试我的应用程序在我的服务器的不同时区,当他们在我的电脑上运行时.
我不想更改区域设置中的时区,而是更改某个应用程序的上下文.
数据库将所有内容存储为UTC,但应用程序会在本地时间向用户显示此内容.但是我在UTC时区对我来说是一样的.
我们的ASP.NET MVC Web应用程序具有向用户发送定期通知电子邮件的功能.我们将添加一项功能,用户可以选择特定时间来接收他们的电子邮件(即"我希望每天下午5点收到一封电子邮件").
我计划使用SQL time类型存储选定的时间.我们将有一个每分钟运行一次的后台进程,并寻找需要通过电子邮件发送的用户.该过程使用LINQ-to-Entities查询来查找所有匹配的用户.我打算写一个查询,基本上找到每日电子邮件时间小于当前UTC时间的所有用户 - 这是我遇到问题的地方.每个用户都可以属于不同的时区 - 我们将他们的时区存储为数据库中的IANA时区标识符.我们在项目中使用NodaTime将存储在我们数据库中的任何日期转换为UTC到用户的时区.为了继续我尝试这样做的方式,我需要一些我可以放在LINQ-to-entities查询中的东西,所以我不能真正使用任何NodaTime函数来转换时间并弄清楚当前时间是日期是在用户指定的时间之后,在他们的时区.我不能只在UTC时间存储他们指定的时间,如果我这样做,那么每当DST到来时它都会被关闭一小时.
我现在能想出的最佳解决方案是"缓存"我们数据库中每个时区的当前UTC偏移量.所以我可以使用一些代码来使用NodaTime来获取每个时区的当前偏移量,并将其保存到存储TimeZoneID和UTCHourOffset的数据库中的表中.我可以有一个常规的过程来运行此代码,并确保缓存的小时偏移保持最新.然后在我的查询中,我可以通过查找缓存的UTC偏移并将其添加到他们的时间来转换每个用户的指定时间,以确定是否应该向他们发送电子邮件.
有没有更简单的方法来做我想做的事情?