我遇到了一个看似常见的问题,即使用 javascript 日期选择器显示并允许用户从可用日程安排日期的日历中选择日期以进行房间预订。
浏览器的时区转换意味着这些日期总是有一定的偏差,所以当服务器(本地时区存储在数据库中的 Assets 或房间)将它们显示为“今天”。
我希望用户的浏览器忽略 javascript 日期转换,只使用数据库传入的实际日期时间。
然而,这甚至发生在像这样一个非常简单的例子中:
var date = '2013-02-05';
var newdate = new Date(date);
console.log(newdate); // Mon Feb 04 2013 16:00:00 GMT-0800 (PST)
看起来 date
变量被浏览器假定为 GMT,当我从它创建一个 javascript 日期对象时,它将 GMT 时间转换为我的本地时间。
在这种情况下,最佳做法是在数据库中使用 GMT 日期,并将站点的本地时间偏移设置为 javascript 中的变量,然后可用于偏移显示给最终用户的日期,并再次偏移从最终用户那里收到的用于插入数据库的日期?
这很令人困惑,因为有太多潜在的陷阱——PHP 语言环境、mysql 语言环境或浏览器的语言环境都可能影响到它并弄乱最终日期。任何有关确保日期值一致的建议都值得赞赏!
最佳答案
好问题,处理时区是一团糟。幸运的是,Javascript 的大部分方法都有 UTC 变体。参见 http://en.wikipedia.org/wiki/Coordinated_Universal_Time
我认为最好的办法是在任何地方都使用 UTC 日期(除了 UI 可能)。确保服务器使用和存储 UTC 日期,并在所有地方使用 javascript UTC 方法。这是第一步也是最重要的一步,因此您知道日期是一致的。
如何在 UI 中显示日期并不那么简单,并且在某种程度上取决于目标受众、应用程序性质等。我认为这是一个更多的讨论主题,并且在 Stack Overflow 中有点无法回答(还有其他主观论坛沉思)。
我会说不要相信浏览器或任何类型的地理定位来自动转换时区;它应该是用户可配置的,或者可能是组/项目/安装特定设置。一些软件主要在一个时区内使用,如果它们用于在某些“标准”时间进行通信,则尝试自动转换时区可能会让用户感到困惑和烦恼。如果用户正在旅行,他或她是否应该看到不同时区的时间?有时它有意义,有时则不然,但至少要确保用户在阅读和输入时间时都知道您遵循的是什么逻辑。
我开发项目管理软件,其中重要的是这些事情由应用程序和用户(!)明确地机器人处理。我的方法是始终强制使用 UTC 进行显示和输入。它在每个日期中也清晰可见,它是 UTC。处理各种时区会很快变得毛茸茸,我决定最好不要那样做。我在 UI 的某些部分有一些助手,它们以精美的字体显示用户本地时区等相同的信息。有一个项目范围的设置“隐藏所有与时区相关的东西,并强制使用时区 x”,可以用于已知永远不会跨越时区边界的较小项目,有使用特定时区的协议(protocol),或者只是给定的,最好不要用这种复杂性来打扰用户。
编辑:我应该补充一点,作为一个例子,这可能会变得多么毛茸茸,有时时间只是时间。在某些情况下,15:00 的事件可能意味着它发生在不同地方的 15:00,在他们各自的本地时区。呃....
关于php - javascript显示中的时区偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14719147/