在mysql中用于时区的数据类型

时间:2011-12-29 03:05:25

标签: mysql timezone

我在我的数据库中存储了UTC的日期/时间。我正在努力在用户选择时区后添加此转换,以便显示它们的本地时间。用户基本上从表单中选择:

<select name="DropDownTimezone" id="DropDownTimezone">
   <option value="-12.0">(GMT -12:00) Eniwetok, Kwajalein</option>
   <option value="-11.0">(GMT -11:00) Midway Island, Samoa</option>
   <option value="-10.0">(GMT -10:00) Hawaii</option>
   ...

我可以将选项值设为我想要的但是容易记住的一个如上所述。我将使用什么数据类型的mysql?在这种情况下真的重要吗? TINYINT会吗?也许使用ENUM会是一个好主意吗?

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:5)

您提议的方案(将时区存储为GMT的整数偏移量)可能会因以下情况而失败:

  • India,UTC + 05:30(不是整数小时)。
  • 基里巴斯,UTC + 14:00(超过12小时)。
  • 区分英国时间和GMT。 (前者使用夏令时;后者则不使用。)
  • 区分使用相同GMT偏移但在一年中不同时间切换的一些国家/地区。

对于全时区支持,我建议使用zoneinfo数据库并将时区存储为字符串(例如,“America / New_York”)。

答案 1 :(得分:0)

虽然这已经很老了。但对于仍在寻找解决方案的任何人。我用了 带时区的 date-fns。我正在将 reactjs 与 node.js 一起使用。只需向表中添加一列额外的列 - 并且始终仅以 UTC 格式存储时间 - 以及附加列中的相应区域。

https://date-fns.org/v2.23.0/docs/Time-Zones

import { zonedTimeToUtc } from 'date-fns-tz'

const date = getDatePickerValue() // e.g. 2014-06-25 10:00:00 (picked in any time zone)
const timeZone = getTimeZoneValue() // e.g. America/Los_Angeles

const utcDate = zonedTimeToUtc(date, timeZone) // In June 10am in Los Angeles is 5pm UTC

postToServer(utcDate.toISOString(), timeZone) // post 2014-06-25T17:00:00.000Z, America/Los_Angeles

对于时区场景 - 列表。 https://www.npmjs.com/package/countries-and-timezones