Symfony 5 登录时如何可靠获取用户时区?
在Symfony 5中可靠获取用户时区的方法
方法1:前端获取+后端存储
浏览器可通过JavaScript获取本地时区,在登录表单提交时传递给后端:
- 在登录表单中添加隐藏字段:
<input type="hidden" name="_timezone" id="timezone"> - 用JS填充时区值:
document.getElementById('timezone').value = Intl.DateTimeFormat().resolvedOptions().timeZone; - 后端接收并存储:
登录时在控制器中获取该值,可存入Session或用户实体(需持久化时):$timezone = $request->request->get('_timezone'); // 存入Session $request->getSession()->set('user_timezone', $timezone); // 或存入用户实体(需先在User类添加timezone字段) $user->setTimezone($timezone); $entityManager->persist($user); $entityManager->flush();
方法2:从Session读取已存储的时区
如果之前已将时区存入Session,后续可直接从Session获取,同时设置默认值避免报错:
$timezone = $request->getSession()->get('user_timezone', 'UTC');
方法3:从用户实体读取持久化时区
若需要长期保存用户时区,建议在User实体中添加timezone字段,用户完成时区设置后存储,之后直接从用户对象获取:
$timezone = $this->getUser()->getTimezone() ?? 'UTC';
关键注意点
- 直接用
$request->request->get('_timezone')获取不到,是因为前端没有传递该字段,必须先通过JS填充并随表单提交。 - 所有获取时区的逻辑都要设置默认值(如UTC),避免因未获取到时区导致程序异常。
内容的提问来源于stack exchange,提问作者Pavlin Petkov
相关产品推荐
相关产品推荐

