2016-02-28 89 views
0

我使用FormatJS library along with Handlebars来显示过去发生的事件列表。我在我的服务器的REST API上调用一个端点,它返回Json中的事件列表,并为每个事件显示日期时间。 ATM我使用GMT时区将日期时间保存在数据库中。使用REST Api和JS时区问题

所以,当我得到我的JSON,我处理日期时间是这样的:

{{formatRelative commentDate}} 

我的问题是,因为日期时间在GMT放养,它们也显示这样的。例如,因为我在GMT + 2时区,所以只要创建新事件并显示在列表中,我就会看到它“在2小时前发生”,而它应该是“几秒前”。

那么,有没有一种方法可以处理这个问题?我在保存日期格林尼治标准时在我的数据库中犯了错误,如果是这样,你将如何处理来自不同时区的日期时间并将它们显示给其他时区中的人?

当然,我可以自定义formatRelative帮手与getTimezoneOffset一起玩,并得到想要的结果,但我想知道是否有更好的办法。

非常感谢!

+1

以UTC为单位存储日期通常是首选,因为它可以简单地转换为任何其他时区。另外,ECMAScript Date对象的核心是UTC。你的问题似乎是关于将“JSON”日期转换为本地日期,但是你不会告诉你如何做到这一点。 – RobG

+0

@RobG因为我没有转换任何东西!获取包含日期时间的Json,格式为“2016-02-28 10:15:53” - 这就是UTC时间,直接在'formatRelative'助手中使用它(如图所示),而不再做任何事情。 –

+1

在体系结构的更多中心部分的世界时间是一个很好的方法:http://currentmillis.com/standard/specification/c/我不认为你犯概念错误,这听起来像你的抵消失去了某个地方。 http://formatjs.io/handlebars/#formatRelative让我相信实际上被格式化的时间被定义为Epoch以来毫秒数的时间,但是我看到你正在返回一个人类可读的时间。是否有一个约定,服务器返回的时间被解释为UTC? (因为你没有指定时区,不应该有一个UTC或GMT到底?) – Sandman

回答

1

理解你的问题的关键是你在评论中写道:

获取JSON,包含格式2016-02-28 10:15:53日期时间 - 这是UTC时间

你应该确保在价值JSON采用完全ISO8601格式,包括相应的偏移量或指示UTC的Z字符:2016-02-28T10:15:53Z

没有偏移量,大多数实现ations将考虑在当地时间中表示的值,这将解释您的结果。

因此,问题出在您的服务器端代码,而不是您的JavaScript代码。当从JSON中解析日期字符串时,可能会有一种客户端解决方法,但最好的解决方案是在服务器上对其进行限定。

+0

非常感谢!我会尝试它,并验证答案,只要我看到它的工作 –

+0

它完美的作品,谢谢:)我只是想知道为什么MySQL不直接在这种格式存储日期时间,而不是我写的? –

+1

数据库(大部分都是)不会将日期时间存储为字符串。它们以自定义二进制格式存储,通常基于自y日期以来x个单元的数量。当您在实用程序中查看它们时,它们可能会被格式化为字符串,或者在您自己的软件中使用它们。许多数据库甚至不会通过本地协议的线路发送字符串。直到你正在消费一种格式适用的消费者。数字也是如此。考虑'1,234.567'。数据库不存储逗号或小数点。 –