在 MySQL 中用于时区的数据类型是什么?

4

我在数据库中存储了一个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个回答

9
您提出的方案(将时区作为与 GMT 的整数偏移量存储)可能在以下情况下失败:
  • 印度,其为 UTC + 05:30(不是整数小时)。
  • 基里巴斯,其为 UTC + 14:00(超过 12 小时)。
  • 区分英国时间和 GMT。 (前者使用夏令时;后者不使用。)
  • 区分一些配有相同 GMT 偏移量但在不同年份切换的国家对之间的差异。
要完全支持时区,请使用 zoneinfo 数据库并将时区存储为字符串(例如,“America/New_York”)。

1
这似乎很令人望而生畏。这是一个包含405个时区的列表。我知道这对于夏令时很重要,但是向用户呈现一个有405个选项的下拉菜单似乎不可用。每个人都是这样做的吗?还是有人提供了更短的列表并忘记了夏令时? - Tom
1
至少,我建议从zoneinfo数据库中挑选一些常见的时区。这样可以确保这些时区的夏令时正常工作。 - user149341
1
@Tom:不要给他们一个405个时区的列表,使用美国/纽约的形式,让他们命名最近的大城市,并包含自动补全器。而且你不能忽略夏令时:亚利桑那州和犹他州处于同一时区,犹他州使用夏令时,但亚利桑那州不使用。 - mu is too short
谢谢,我认为那就是我所拥有的,我会坚持我的短列表,并将其与zoneinfo进行交叉引用。我想VARCHAR将被用来存储该值。 - Tom
@muistooshort 谢谢,我会看一下的,希望已经有类似用jquery或其他东西完成的东西了。 - Tom
看看 jQuery 选择插件 - 它为您提供了一个甜蜜可搜索的自动完成 <select>: http://harvesthq.github.com/chosen/ - user149341

0

尽管这已经很旧了,但对于仍在寻找解决方案的任何人来说,我使用了带有时区的 date-fns。我正在使用 node.js 的 reactjs。只需要将一个额外的列添加到表中 - 并始终仅以 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接