日期格式被插入数据库 + 4 小时
Posted
技术标签:
【中文标题】日期格式被插入数据库 + 4 小时【英文标题】:Date format gets inserted in database + 4 hours 【发布时间】:2019-12-10 11:29:40 【问题描述】:我正在使用全日历 (https://fullcalendar.io)。 当我将一个事件从一个时间转移到另一个时,小时会改变 + 4 小时。但是当我点击一个日期并添加一个事件时,这不会发生。
这是我的“eventDrop”事件:
eventDrop: function(eventDropInfo)
console.log(eventDropInfo);
$.ajax(
url: 'update.php',
data: 'id='+ eventDropInfo.event.id+'title='+ eventDropInfo.event.title+'&start='+ eventDropInfo.event.start.toISOString()+'&allDay='+ eventDropInfo.event.allDay,
type: "POST",
success: function(json)
alert('success');
calendar.refetchEvents();
);
,
我的Update.php文件如下:
// get database connection
require_once 'api/config/connection.php';
// Check user information
$fusername = $_SESSION['fusername'];
$stmt = $conn->prepare("SELECT * FROM users WHERE fusername=:fusername;");
$stmt->bindParam(':fusername', $fusername);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_OBJ);
if(isset($_POST["id"]))
$start_event = $_POST['start'];
$end_event = $_POST['end'];
$id = $_POST['id'];
$allDay = $_POST['allDay'];
// Check user information
$stmt = $conn->prepare("UPDATE events SET start_event=:start_event, end_event=:end_event, allDay=:allDay WHERE id=:id");
$stmt->bindParam(':start_event', $start_event);
$stmt->bindParam(':end_event', $end_event);
$stmt->bindParam(':id', $id);
$stmt->bindParam(':allDay', $allDay);
$stmt->execute();
控制台中的 event.start 显示为: 开始时间:2019 年 7 月 30 日星期二 08:00:00 GMT-0400(东部夏令时间)
但是当我应用“.toISOString”时,它会转换为“2019-07-30T12:00:00.000Z”并作为 2019-07-30 12:00:00(提前 4 小时)发布到数据库.
我还注意到,当我单击日期单元格以添加事件时,使用 console.log 从事件对象 startStr 和 endStr 获取如下:
开始时间:2019 年 8 月 4 日星期日 05:30:00 GMT-0400(东部夏令时间)
结束:2019 年 8 月 4 日星期日 06:00:00 GMT-0400(东部夏令时间)
startStr: "2019-08-04T05:30:00-04:00"
endStr: "2019-08-04T06:00:00-04:00"
这(上图)正是我希望将事件放入日期单元格时的日期格式。
但是,当我使用 toISOString 时,我的日期时间会转换为带有 (Z) 的“T12:00:00.000Z”,而不是在最后添加非现场时间。它们如何转换为“T05:30:00-04:00”?我的意思是,我只需要日期是 XX:XX:XX,并这样输入到数据库中。
任何帮助表示赞赏!谢谢。
【问题讨论】:
【参考方案1】:toISOString() 使用 UTC-0 并相应地调整日期。
https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Date/toISOString
【讨论】:
我现在明白了。有没有办法在日历上实际显示时间而不将其更改为 UTC-0?我的意思是,我将事件拖到上午 8 点的时段,但一旦进入数据库,它就会将其更改为下午 12 点。 :-( 所以,现在我的控制台日志显示:开始:2019 年 7 月 31 日星期三 08:00:00 GMT-0400(东部夏令时间),但在我应用 toISOString() 后,它变为 12:00:00。 我会将日期/时间以 UTC-0 格式存储在数据库中,并在业务层处理偏移量。这样它就在数据库中标准化并为用户本地化。看起来 FullCalendar 对时区有一些支持。 fullcalendar.io/docs/date-parsing 谢谢戴夫。问题是我从 fullcalendar 获得的日期/时间混淆了。我刚刚更新了上面的问题。如果可以,请重新阅读。感谢您的关注和帮助。 ;-) 你的问题和答案真的没有改变。 Fullcalendar.io [似乎是] 使用本地时区,但您的代码在调用 toISOString() 方法时明确将时间更改为 UTC-0。因此,您需要将所有日期设为 UTC-4 或将所有日期设为 UTC-0。我假设你希望它们都是 UTC-4,所以从你的更新语句中删除 toISOString() 方法。这会将事件日期对象(而不是字符串)传递给 update.php。 我手头没有那个源代码,所以我不知道它是否会接受它,但尝试一下。如果没有,您将不得不手动格式化数据。你可以通过多种方式做到这一点,但是 fullcalendar.io 有一个用于 moment.js 的插件,这使得这很容易。快速搜索会显示语法。以上是关于日期格式被插入数据库 + 4 小时的主要内容,如果未能解决你的问题,请参考以下文章