RFC3339 是一种互联网日期和时间格式标准,它是 ISO 8601 的一个子集,常用于 API 交互中。Google 日历 API 使用这种格式来表示日期和时间。
RFC3339 格式示例:
2023-05-15T14:30:00+08:00
2023-05-15
14:30:00+08:00
$date = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
$rfc3339 = $date->format(DateTime::RFC3339);
echo $rfc3339; // 输出类似:2023-05-15T14:30:00+08:00
$rfc3339String = '2023-05-15T14:30:00+08:00';
$dateTime = DateTime::createFromFormat(DateTime::RFC3339, $rfc3339String);
echo $dateTime->format('Y-m-d H:i:s'); // 输出:2023-05-15 14:30:00
// 从 Google 日历 API 获取的事件日期处理
$eventStart = '2023-05-15T14:30:00+08:00';
$eventEnd = '2023-05-15T15:30:00+08:00';
$startDateTime = DateTime::createFromFormat(DateTime::RFC3339, $eventStart);
$endDateTime = DateTime::createFromFormat(DateTime::RFC3339, $eventEnd);
// 计算持续时间
$duration = $startDateTime->diff($endDateTime);
echo "会议将持续: " . $duration->format('%h小时%i分钟');
function formatFriendlyDate($rfc3339String) {
$date = DateTime::createFromFormat(DateTime::RFC3339, $rfc3339String);
$now = new DateTime();
$diff = $now->diff($date);
if ($diff->days == 0) {
return "今天 " . $date->format('H:i');
} elseif ($diff->days == 1) {
return "明天 " . $date->format('H:i');
} elseif ($diff->days == -1) {
return "昨天 " . $date->format('H:i');
} elseif ($diff->days < 7 && $diff->days > 0) {
return "下" . $date->format('l H:i');
} else {
return $date->format('Y年m月d日 H:i');
}
}
echo formatFriendlyDate('2023-05-15T14:30:00+08:00');
原因:服务器时区与客户端时区不一致导致显示错误
解决方案:
// 明确指定时区
$date = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
$rfc3339 = $date->format(DateTime::RFC3339);
原因:输入的字符串不完全符合 RFC3339 标准
解决方案:
try {
$date = DateTime::createFromFormat(DateTime::RFC3339, $inputString);
if (!$date) {
throw new Exception("Invalid RFC3339 format");
}
} catch (Exception $e) {
// 处理错误
}
原因:直接使用字符串操作而非 DateTime 对象
解决方案:
// 正确做法 - 使用 DateTime 对象计算
$date1 = DateTime::createFromFormat(DateTime::RFC3339, $string1);
$date2 = DateTime::createFromFormat(DateTime::RFC3339, $string2);
$interval = $date1->diff($date2);
通过以上方法,您可以有效地在 PHP 中处理 Google 日历 API 使用的 RFC3339 日期格式,并实现用户友好的日期显示。
没有搜到相关的沙龙