我在数据库中存储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是个好主意?
您建议的方案(将时区存储为GMT的整数偏移量)可能在以下情况下失败:
- 印度,在UTC + 05:30(不是整数小时数)。
- 基里巴斯,位于UTC + 14:00(超过12小时)。
- 区分英国时间和格林尼治时间。(前者使用日光节约时间;
- 区分使用相同GMT偏移量,但在一年中的不同时间切换的一些国家对。
对于完整时区支持,我建议使用zoneinfo
数据库并将时区存储为字符串(例如,"America/New_York")。
虽然这是很古老的。但对于那些还在寻找答案的人来说。我使用带时区的Date-fns。我使用node.js的reactjs。只需要在表中添加一个额外的列——并且始终只以UTC格式存储时间——并在额外的列中添加相应的区域。
https://date-fns.org/v2.23.0/docs/Time-Zonesimport { 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
对于timezones - list的场景。https://www.npmjs.com/package/countries-and-timezones