如果要在多个时区运行应用程序,我们是否应该以日期或日期时间格式存储日期?

时间:2017-10-03 06:38:43

标签: php mysql date datetime timezone

我的客户希望在多个国家/地区运行他的网站。我们正在使用MySQL进行应用。因此,在MySQL中存储日期字段时,我应使用日期日期时间来存储简单的日期字段。

让我举一个我在这里面临的问题的例子。我今天已经在2017年10月3日在印度订购了订单,但2017年10月2日在美国订购了订单。我已经要求用户设置他们的时区。但是我们可以简单地通过使用日期字段来解决上述问题,或者我们应该去日期时间吗?

由于

3 个答案:

答案 0 :(得分:0)

DATE, DATETIME, and TIMESTAMP MySQL

之间的差异
  1. DATE类型用于具有日期部分但没有时间部分的值。 MySQL在' YYYY-MM-DD'中检索并显示DATE值。格式。该 支持的范围是' 1000-01-01'到' 9999-12-31'。
  2. DATETIME类型用于包含日期和时间的值 部分。 MySQL在' YYYY-MM-DD中检索并显示DATETIME值 HH:MM:SS'格式。支持的范围是' 1000-01-01 00:00:00'至 ' 9999-12-31 23:59:59'。
  3. TIMESTAMP数据类型用于包含两个日期的值 和时间部分。 TIMESTAMP的范围为' 1970-01-01 00:00:01'世界标准时间 到' 2038-01-19 03:14:07' UTC。

答案 1 :(得分:0)

您可以使用时间戳。哪个会自动转换为UTC。然后在运行的服务器上计算时差。但这需要您将该逻辑放入您访问日期的任何地方的代码(或select语句)中。 See this post

否则,使用日期或日期时间可能相同,因为它们都不存储时区。日期时间似乎更精确,因为它记录到第二天而不是一天。

查看documentation

只需转到该链接并点击Ctrl + F,然后搜索“时区”,即可准确查看时区的处理方式。

似乎时区不会转换为日期时间。但是,如果您的服务器在不同的时区运行,这仍然可能是一个问题,因为当您读出时,使用服务器的日期时间,并且无法保证正在读取记录的服务器位于同一时区写入记录的服务器 - 这可能会引入错误。

绕过这个。我曾经在一个团队中工作,该团队将日期时间存储为字符串,并在末尾附加时区。

// In this format
Mon, 17 Apr 2006 21:22:48 GMT

然后,当我们从数据库中读取时,我们将它们转换为Java 8 String Datetime对象。但是,我知道这是一个非常具体的实现。

答案 2 :(得分:0)

UTC

将UTC视为 One True Time tm 。所有其他区域和偏移仅仅是变化。

以UTC格式存储时间轴上的时刻。以UTC格式存储实际历史记录

TIMESTAMP WITH TIME ZONE

在标准SQL中,这意味着使用数据类型TIMESTAMP WITH TIME ZONE。数据库通常将输入调整为UTC。有些还存储了原始时区,有些像Postgres在使用它进行UTC调整后会使区域失效。

听起来这就是你需要的类型。

虽然我不使用MySQL,it looks like相当于标准类型TIMESTAMP

在Java中,您将此值检索为Instant对象。然后通过分配ZonedDateTime

将其作为ZoneId呈现给用户

在SQL中,您可以在检索期间指定时区。一般来说,最好让应用程序从UTC调整到我认为的区域,但请使用您自己的判断。

TIMESTAMP WITHOUT TIME ZONE

在讨论跨时区的一般时刻时,例如“我们所有的工厂全球停在午餐时间12:30”,请使用标准类型TIMESTAMP WITHOUT TIME ZONE

此外,还可以使用此类型来安排未来事件,以便将来可能更改时区定义。世界各地的政治家都表现出对搞乱时区的偏好。他们通常很少注意到,有时只需几周。检索值时动态应用时区。

虽然我不使用MySQL,it looks like相当于标准类型DATETIME

DATE

标准类型DATE表示仅限日期的值,没有时间和没有时区。

正如您所知,仅限日期的值不明确。对于任何给定的时刻,日期在全球范围内因地区而异。

这听起来符合您的需求。当你提到一个日期时,你暗中想要一个时刻。无论您的业务规则是什么,也许在印度开始营业时间(Asia/Kolkata),或芝加哥时间中午(America/Chicago),或UTC当天的第一时刻。

您需要进行调查,以确定您尝试表示为数据的信息的实际含义。

所有这些已经在Stack Overflow上多次讨论过了。请在发布前仔细搜索,现在就了解更多信息。

请注意日期时间工作是棘手的事情,而且往往是反直觉的。如果您天真地认为日期工作应该快速而简单,那么您需要了解更多信息。慢下来,学习和实验。

实施例

如果您正在记录10月3日上午8点在印度拍摄的订单,则以UTC:2017-10-03 02:30Z存储,因印度比UTC早5个半小时。提示:Z是Zulu的缩写,意思是UTC。

如果用户想要查看与其他时区相同的时刻,请进行调整。对于America/Chicago UTC后五个小时,所以上一个日期是10月2日而不是第3个:2017-10-02 21:30。这与其他两个相同。我们有三种观察同一时刻的方式。