mysql - 创建一个预订系统,但我很难将输入日期插入 MySQL 表
问题描述
我是编程新手,尝试使用 reactjs、node 和 mysql 创建汽车租赁系统,但我很难将日期插入数据库。我知道我必须以某种方式将其设为字符串并使其成为本地时区,但无法弄清楚。
日期.js:
dateOut = "";
dateIn = "";
location = "";
render()
return(
}
<input type="date" value={this.dateOut} onChange={e => (this.dateOut = e.target.value)} />
<input type="date" value={this.dateIn} onChange={e => (this.dateIn = e.target.value)} />
<input type="text" value={this.location} onChange={e => (this.location = e.target.value)}>
);
add() {
orderService.addOrder(
this.dateOut,
this.dateIn,
this.location
id => {
history.push('/cars/' + id);
}
);
}
} ```
services.js:
```addOrder(dateOut, dateIn, location, success) {
connection.query(
'insert into Orders (dateOut, dateIn, location, success) values (?, ?, ?)',
[dateOut, dateIn, location],
(error, results) => {
if (error) return console.error(error);
success(results.insertId);
}
);
} ```
解决方案
以下是如何处理这个问题。
- 将您的
dateOut
和dateIn
列声明为表中的TIMESTAMP
数据类型。 - 当您为
insert
查询提供日期/时间值时,请使用格式如2019-04-08 16:52
. 或使用 Javascript 日期对象。 - 注册用户时,询问他们的时区偏好,特别是要求他们从
mysql.time_zone_name.name
. - 将该首选项作为字符串(如
Asia/Kolkata
或America/Halifax
)存储在您的用户首选项表中。VARCHAR(63)
是该列数据类型的不错选择。 - 每次您代表用户在应用程序中使用 MySQL 连接时,首先发出命令
SET time_zone = whateverTheyChose
来设置用户的时区首选项。
为什么这样好? TIMESTAMP
数据类型值始终以 UTC 存储,并且在检索或存储它们时始终转换为当前设置的时区或从当前设置的时区转换。
如果要将当前日期/时间值插入列中,可以执行以下操作:
insert into Orders
(dateOut, dateIn, location, success)
values (NOW(), NOW(), ?, ?)
请注意子句中的值和占位符如何与values()
列列表中的项目一一对应。
您可以在 'toobz 上阅读有关 MySQL 时区处理系统的信息。它基于IANA 的 zoneinfo 数据库。该数据库的维护者负责处理所有奇怪的时空政治因素,例如土库曼斯坦或美国印第安纳州的白天时间何时开始和结束,因此我们其他人不必这样做。
如果您使用DATE
orDATETIME
数据类型而不是TIMESTAMP
,则不会获得自动时区的内容。这些数据类型或多或少类似于时钟的照片。
无论您使用哪种数据类型,您都可以使用名为TIMESTAMPDIFF()的 MySQL 函数来计算持续时间。例如,
TIMESTAMPDIFF(HOUR, dateOut, dateIn)
告诉您两个日期/时间值之间的小时数。即使您的两个值跨越日光时间切换日,它也会正常工作。
值得您花大量时间了解您的 dbms 如何处理日期和时间。他们做得很好,所以你不必重新发明瘪胎。
而且,在应用程序生命周期的早期正确设置所有这些都是值得的。改变一个正在运行的系统来处理这些时区是非常非常困难的。(不要问我怎么知道这很难!)
推荐阅读
- c# - GET 和 POST 在 webapi 上使用 POST 带参数但 GET 不带参数
- ios - FFmpeg 构建错误“未找到 openssl”(适用于 Mac 上的 iOS)
- c++ - 在 dlopen 之后使用 fork
- actions-on-google - 如何处理在对话流中分为 2 个实体的实体?
- http - IIS 服务器状态 500 错误 0x8007000d - web.config 中的“格式错误的 xml 元素”是什么?
- rust - 如何将特征对象转换为“子特征”对象?
- bash - 为需要引号的命令构造参数
- c - 读取整个管道 - c
- c# - 错误不支持文件的磁盘结构...找到 11.1,支持 12.0
- tensorflow - 运行 tensorflow 的 object_detection_model (下载模型出错)