开发者社区 问答 正文

使用Laravel Carbon将JavaScript时间转换为PHP

我正在开发一个网站,其前端为Angular 8,后端为Laravel(version:5.8。*)。我想将用户选择的日期存储在MySQL数据库中。用户将所选日期过帐2019-11-19T02:30:14.000Z。在app.php时区已被宣布为“亚洲/加尔各答”。我想将js日期转换为具有指定时区的PHP日期。在我的控制器中:

$date_with_timezone=\Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date_no_timezone,'Asia/Kolkata');

但它不返回任何内容,显示500错误。注意:我是Laravel的初学者。

我该怎么做?

展开
收起
社区秘书 2019-11-19 14:23:17 852 分享
分享
版权
举报
阿里云 AI 助理回答

遇到500错误通常意味着服务器端发生了错误,但没有足够的信息来直接判断问题所在。根据你的描述,你尝试使用Carbon库将JavaScript传递的日期字符串转换为指定时区(亚洲/加尔各答)的PHP日期对象。这里有几个可能的问题和解决方法:

  1. 日期格式不匹配: 你提到用户提交的日期格式是 2019-11-19T02:30:14.000Z,这包含了时间戳的毫秒部分以及Zulu时间标识(表示UTC)。而你在createFromFormat中使用的格式字符串是 'Y-m-d H:i:s',这并不匹配用户输入的日期格式,特别是它没有考虑到毫秒和时区。

    解决方案:调整创建日期的格式字符串以匹配输入的日期格式,包括毫秒部分。但是,由于Carbon不直接支持解析ISO 8601格式中的毫秒部分,你需要先去掉这个部分或者使用其他方式处理。例如,如果可以控制前端传入的数据格式,最好传入不包含毫秒且已转换为所需时区的时间字符串。

  2. 处理UTC时间: 由于用户输入的是UTC时间(Z结尾),在转换到本地时区之前,需要确保正确处理这个UTC时间。

    解决方案:首先,如果你能确保前端发送的是已经按照'Asia/Kolkata'时区调整过的时间,那么可以直接用这个时间进行存储,不需要再转换。如果前端发送的是UTC时间,你可以先用Carbon的parsecreateFromTimestamp方法处理UTC时间,然后再设置时区。

  3. 错误处理与日志查看: 为了更准确地了解500错误的原因,你应该查看Laravel的日志文件(默认位于storage/logs/laravel.log)。日志会提供详细的错误信息,帮助定位问题。

    解决方案:检查日志文件,找到导致500错误的具体异常信息,然后针对性地解决问题。

一个可能修正后的代码示例,假设你去掉了毫秒部分并希望直接从UTC转换到"Asia/Kolkata":

use Carbon\Carbon;

// 假设$date_no_timezone 是 "2019-11-19T02:30:14Z"
$date_utc = Carbon::parse($date_no_timezone)->timezone('UTC');
$date_with_timezone = $date_utc->copy()->setTimezone('Asia/Kolkata');

// 然后你可以保存或使用 $date_with_timezone

请记得,实际操作前务必查看日志,以获取最准确的错误信息,并根据实际情况调整解决方案。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等