javascript显示中的时区偏移
Posted
技术标签:
【中文标题】javascript显示中的时区偏移【英文标题】:timezone offset in javascript display 【发布时间】:2013-01-21 01:34:18 【问题描述】:我遇到了一个常见问题,即使用 javascript 日期选择器显示并允许用户从可用日程安排日期的日历中选择日期以进行房间预订。
浏览器的时区转换意味着这些日期总是有一定的偏差,因此通常在向用户显示保留日期时,日期将落在查看者的“明天”,当服务器(本地时区到存储在数据库中的资产或房间)将它们显示为“今天”。
我希望用户的浏览器忽略 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 语言环境或浏览器的语言环境都可能会影响它并弄乱最终日期。任何有关确保一致的日期值的建议表示赞赏!
【问题讨论】:
我必须自己实现一个解决方案,这并不有趣,但我发现以下问题减少了:始终将所有内容存储为 UTC/GMT 以及单独的时区。尝试将时区附加到您在不知道是 UTC 的任何地方传递的任何日期。给用户一个下拉菜单来选择时区而不是尝试猜测,如果有任何尝试和猜测并将时区下拉菜单设置为猜测的区域,除非他们可以在某种用户设置页面或注册表单中明确设置它。不是一个真正的答案,但我希望它无论如何都会有所帮助。 有什么解决办法吗? 【参考方案1】:好问题,处理时区是一团糟。幸运的是,Javascript 的大多数方法都有 UTC 变体。见http://en.wikipedia.org/wiki/Coordinated_Universal_Time
我认为最好在任何地方都使用 UTC 日期(UI 也许除外)。确保服务器使用和存储 UTC 日期,并在任何地方使用 javascript UTC 方法。这是第一步也是最重要的一步,因此您知道日期是一致的。
您在 UI 中呈现日期的方式不那么直接,并且取决于目标受众、应用程序性质等。我认为这更像是一个讨论主题,并且在 Stack Overflow 中有点无法回答(还有其他主观论坛思考)。
我想说不要相信浏览器或任何类型的地理位置来自动转换时区;它应该是用户可配置的,或者可能是组/项目/安装特定设置。一些软件主要在一个时区内使用,如果他们习惯于在某个“标准”时间进行通信,那么尝试自动转换时区可能会让用户感到困惑和烦恼。如果他或她正在旅行,用户是否应该看到不同时区的时间?有时有意义,有时没有,但至少要确保用户在读取和输入时间时都知道您遵循的逻辑。
我开发项目管理软件,重要的是这些事情由应用程序和用户(!)明确地处理。我的方法是始终强制使用 UTC 进行显示和输入。在每个日期中也可以清楚地看到它是 UTC。处理各种时区会很快变得棘手,我决定最好不要这样做。我在 UI 的某些部分有一些助手,它们在用户本地时区等中以精美的形式显示相同的信息。有一个项目范围的设置来“隐藏所有与时区相关的东西,并强制时区 x”,可用于已知永远不会跨越时区边界的较小项目,有使用某个区域的协议,或者它只是给定的,最好不要用这种复杂性打扰用户。
编辑:我应该补充一点,作为一个例子,这会变得多么棘手,有时一次只是一次。在某些情况下,15:00 发生的事件可能意味着它发生在 15:00 在不同的地方,在各自的当地时区。呃……
【讨论】:
以上是关于javascript显示中的时区偏移的主要内容,如果未能解决你的问题,请参考以下文章