【问题标题】:Datetime changing on JSON responseJSON响应上的日期时间更改
【发布时间】:2021-02-09 08:52:03
【问题描述】:

我正在从project_stage 命名表中选择项目的开始和结束日期。

这里是表格元素

stage_start_date    stage_end_date       planned_start_date   planned_end_date
2019-01-28 10:12:01  2020-12-08 09:05:28 2019-01-12 01:01:00  2020-12-01 00:00:00

这里的数据类型是DATETIME

这是代码

SELECT ps.stage_start_date AS actual_start_date, 
       ps.stage_end_date AS actual_end_date, 
       ps.stage_planned_start_date AS planned_start_date, 
       ps.stage_planned_end_date AS planned_end_date 
FROM project_stage AS ps 
JOIN map_project_user AS mpu ON mpu.user_id = 22 AND mpu.project_id = 1 AND mpu.tenant_id = ps.tenant_id AND ps.project_id = mpu.project_id;

JSON 响应结果

{
   "actual_start_date": "2019-01-28T04:42:01.000Z",
   "actual_end_date": "2020-12-08T03:35:28.000Z",
   "planned_start_date": "2019-01-11T19:31:00.000Z",
   "planned_end_date": "2020-11-30T18:30:00.000Z"
}

这里的日期时间正在改变它而不是表中的实际日期时间,为什么日期在结果上发生变化。这是预期的输出

预期结果

{
   "actual_start_date": "2019-01-28 10:12:01",
   "actual_end_date": "2020-12-08 09:05:28",
   "planned_start_date": "2019-01-12 01:01:00",
   "planned_end_date": "2020-12-01 00:00:00"
}

MYSQL DATATYPE 是DATETIME。数据库timezoneUTC中,系统timezone也显示UTC,我怎样才能把这个日期时间转换为用户系统的timezone对应

【问题讨论】:

  • 什么是将查询结果转换为json?
  • 似乎是时区问题。像 UTC vs IST (+5:30)
  • 时区,您的 SQL 服务器必须位于不同的时区。您应该获取该服务器的时区并在您的代码中说明它,或者更改时区
  • MySQL 中的 DATATYPE 是什么? DATETIMETIMESTAMP 工作方式不同。 SHOW VARIABLES LIKE '%zone%'; 你电脑的时区是多少?对于服务器?
  • 实际上时区编码在json的最后一位000Z中。因此,加载 json 的应用程序可以贪图任何所需的时区。

标签: mysql sql node.js json


【解决方案1】:

根据数据示例,时区问题似乎出现在将 SQL 结果转换为 JSON 的代码中。由于数据库和 JSON 的时间差是 -05:30,看来“JSON 转换器”假设 SQL 查询的结果是 IST(UTC +05:30)并将时间转换为 UTC(减去 5 :30)。

应该在“JSON 转换器”中进行正确的修复。但是,如果要求通过修改SQL查询来实现“更正日期”,则可以使用CONVERT_TZ (dt, from_tz, to_tz)函数。这增加了 +5:30 和“JSON 转换器”减去 5:30 后导致时间不变。

类似的东西:

SELECT DATE_FORMAT(CONVERT_TZ(ps.stage_start_date, '+00:00', '+05:30'), "%Y-%m-%d %H:%i:%s") AS actual_start_date, 
       DATE_FORMAT(CONVERT_TZ(ps.stage_end_date, '+00:00', '+05:30'), "%Y-%m-%d %H:%i:%s") AS actual_end_date, 
       DATE_FORMAT(CONVERT_TZ(ps.stage_planned_start_date, '+00:00', '+05:30'), "%Y-%m-%d %H:%i:%s") AS planned_start_date, 
       DATE_FORMAT(CONVERT_TZ(ps.stage_planned_end_date, '+00:00', '+05:30'), "%Y-%m-%d %H:%i:%s") AS planned_end_date 
FROM project_stage AS ps 
JOIN map_project_user AS mpu ON mpu.user_id = 22 
                             AND mpu.project_id = 1
                             AND mpu.tenant_id = ps.tenant_id
                             AND ps.project_id = mpu.project_id;

编辑:另一种选择:只需将 +5:30 添加到日期:

SELECT ps.stage_start_date + interval 5 hour + 30 minute AS actual_start_date, 
       ps.stage_end_date + interval 5 hour + 30 minute AS actual_end_date, 
       ps.stage_planned_start_date + interval 5 hour + 30 minute AS planned_start_date, 
       ps.stage_planned_end_date + interval 5 hour + 30 minute AS planned_end_date 
FROM project_stage AS ps 
JOIN map_project_user AS mpu ON mpu.user_id = 22 
                             AND mpu.project_id = 1
                             AND mpu.tenant_id = ps.tenant_id
                             AND ps.project_id = mpu.project_id;

【讨论】:

  • 它们的输出没有变化,输出相同:{"actual_start_date": "2019-01-28T10:12:01.000Z"}
  • 添加了第二个选项来回答stage_start_date + interval 5 hour + 30 minute
  • 第二个选项也没有给出预期的结果,这是从第二个选项20201201050030得到的操作@
  • @RahmanHaroon,您第一条评论中的时间输出与您对 stage_start_date 的预期结果相同:10:12:01
  • 这是T10:12:01.000Z的结果,但我只需要得到10:12:01 @TaaviTitsu
【解决方案2】:

您的后端更改了时间格式。检查连接到数据库的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2010-12-01
    • 2019-02-09
    • 1970-01-01
    • 2016-12-29
    • 2021-12-18
    相关资源
    最近更新 更多