何时将 UTC 日期时间转换为用户的本地时间以获得多语言支持


When to convert UTC datetime to user's local for multi-language support

我知道这个主题已经被讨论过很多次了。快速的答案总是"越晚越好"。但我不确定多久会被认为是不好的做法。

我在我的应用程序中使用日期时间。如果我把它留到最后一刻,即在将数据发送到视图之前,我将不得不为每个日期时间做无聊的重复代码,就像这样:

$dateOBJ = new DateTime($date);
$timezoneOBJ = new DateTimeZone($user_timezone);
$dateOBJ->setTimezone($timezoneOBJ)->format($my_format);

当我可以在脚本开头只做一次时:

date_default_timezone_set($user_timezone);

并在查询之后(或期间,如果我要使用SQL函数)将所有字段从UTC转换为用户。因此,单个模型例程将为我处理它,我再也不会担心它,即使是表单输入。

为什么这种做法不好?

时间戳或日期/时间是绝对时间点,是人类历史上的精确点。这个时间戳的确切存储方式并不重要,有许多格式都解析到同一时间点
特定时区中以特定于区域设置的格式的人类可读时间格式只是向用户呈现该时间点的一种非常具体的方式。这本质上是一个表示层的东西,而不是模型正在处理的东西。

也许作为一个更好的例子,取数值123456.789。这是纯数学意义上的绝对数值。这是您在模型中计算所基于的值。但是,在 UI 中,此数字可能显示为"123,456.789"或"123.456,789"或"12,34,56.789"或任何其他特定格式,具体取决于用户的期望。您只能在模板中以这种方式格式化它:

<p><?php echo number_format($number); ?></p>

出于同样的原因,您应该对时间戳执行相同的操作。如果您认为这样做的代码太长,请使其更短:

<p><?php echo format_my_date($date); ?></p>

或:

<p><?php echo $myCustomDateObject->formatLocal($locale); ?></p>

或:

$dateTimeFormatter = new MyDateTimeFormatter($userLocale, $userTimezone);
...
<p><?php echo $dateTimeFormatter->format($date); ?></p>

根据我自己的意见,始终将数据库中的时间保存在固定时区,并在显示时根据用户时区显示它。我认为这不必被视为一种不好的做法。因为向用户显示有关自己的时区的信息更相关。