使用用户本地日期时间保存日期时间问题

Posted

技术标签:

【中文标题】使用用户本地日期时间保存日期时间问题【英文标题】:Save datetime issue with users local datetime 【发布时间】:2011-09-25 08:02:26 【问题描述】:

我在网站中构建了类似聊天服务的东西,当用户发送或接收消息时,我会为他显示消息发送或接收的时间。

我将所有消息都保存在数据库中。

现在问题出在:托管网站的服务器在美国,一些用户来自不同的国家,不同的时区。

所以我的用户发送了一条消息,例如他在埃及,他会看到他的消息是 6 小时前发送的,而不是他刚刚发送的:)

我想知道facebook、twitter和***等网站是如何解决这个问题的。

注意事项: - 注册时我不会询问用户他的时区或国家/地区。 - 我正在使用 ASP.Net MVC。 - 我正在使用 timeago jquery 插件来显示漂亮的格式化日期。

【问题讨论】:

【参考方案1】:

如果时间戳存储为Coordinated Universal Time (UTC),那么您所要做的就是根据用户的本地时区格式化数据库中的值。

例如,假设数据库中的时间戳以毫秒为单位(例如 1309365893296),那么在 javascript 中,您可以执行以下操作将其转换为用户的本地时区:

var localtime = new Date(1309365893296);

【讨论】:

我会推荐相同的解决方案。【参考方案2】:

我猜最好的方法是在用户提交文本时从他们的 PC 收集 DateTime 值。

据此,您应该能够根据时差确定他们所在的时区。

然后,每当您在应用程序中显示时间戳时,添加或减去小时数差异。

【讨论】:

【参考方案3】:

您需要做的是使用DateTime.UtcNow 存储所有时间戳

当您去向用户显示时间时,您可以使用变量中的.ToLocalTime() 将其转换为每个用户的本地时区。

【讨论】:

.ToLocalTime() 将返回当前服务器的本地时间而不是用户浏览器时间。

以上是关于使用用户本地日期时间保存日期时间问题的主要内容,如果未能解决你的问题,请参考以下文章

Utc 日期保存为 Sqlite 中的本地日期

如何仅使用标准库将 UTC 日期时间转换为本地日期时间?

将 UTC 日期时间全局转换为用户指定的本地日期时间

实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字

用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

如何获取设备独立的本地日期和时间Android