【问题标题】:Creating a booking system, but I struggle with inserting the input date to MySQL table创建一个预订系统,但我很难将输入日期插入 MySQL 表
【发布时间】:2019-08-30 01:53:42
【问题描述】:

我是编程新手,尝试使用 reactjs、node 和 mysql 创建汽车租赁系统,但我很难将日期插入数据库。我知道我必须以某种方式将其设为字符串并使其成为本地时区,但无法弄清楚。

date.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);
      }
    );
  } ```

【问题讨论】:

  • 您还没有发布您收到的错误消息,而且当您显示没有值的函数的 sn-ps 时,很难找到问题。一些日志记录可能会有所帮助。此外,您在 SQL 语句中提到了您的 success 变量,这绝对是错误的。

标签: mysql reactjs function date datetime


【解决方案1】:

以下是处理此问题的方法。

  1. 在表中将 dateOutdateIn 列声明为 TIMESTAMP 数据类型。
  2. 当您向insert 查询提供日期/时间值时,请使用格式为2019-04-08 16:52 的文本字符串。或者使用 Javascript Date 对象。
  3. 注册用户时,询问他们的时区偏好,特别是要求他们从mysql.time_zone_name.name 中的值之一中进行选择。
  4. 将该首选项作为字符串(如Asia/KolkataAmerica/Halifax)存储在您的用户首选项表中。 VARCHAR(63) 是该列数据类型的不错选择。
  5. 每次您在应用中代表用户使用 MySQL 连接时,首先发出命令 SET time_zone = whateverTheyChose 来设置用户的时区偏好。

为什么这么好? TIMESTAMP 数据类型值始终以 UTC 格式存储,并且在检索或存储它们时始终转换为/从当前设置的时区转换。

如果要将当前日期/时间值插入列中,可以执行以下操作:

insert into Orders 
       (dateOut, dateIn, location, success) 
values (NOW(),    NOW(),        ?,       ?)

注意values() 子句中的值和占位符如何与列列表中的项目一一对应。

您可以阅读有关MySQL's time zone handling system on the 'toobz 的信息。它基于IANA's zoneinfo database。该数据库的维护者负责处理所有奇怪的时空政治因素,例如土库曼斯坦或美国印第安纳州的白天时间何时开始和结束,因此我们其他人不必这样做。

如果您使用DATEDATETIME 数据类型而不是TIMESTAMP,则不会得到自动时区的内容。这些数据类型或多或少类似于时钟的照片。

无论您使用哪种数据类型,您都可以使用名为TIMESTAMPDIFF() 的 MySQL 函数来计算持续时间。例如,

TIMESTAMPDIFF(HOUR, dateOut, dateIn) 

告诉您两个日期/时间值之间的小时数。即使您的两个值跨越日光时间切换日,它也能正常工作。

值得您花大量时间了解您的 dbms 如何处理日期和时间。他们做得很好,所以你不必重新发明瘪胎。

而且,在应用程序生命周期的早期正确设置所有这些都是值得的。更改正在运行的系统来处理这些时区非常非常。 (别问我怎么知道难!)

【讨论】:

  • 感谢您这么好的回复,但我仍然不知道如何获取 的值,以便它可以在 onClick={this.add 上自动执行插入功能}..
猜你喜欢
  • 2012-05-05
  • 2012-04-12
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多