Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 何时将UTC日期时间转换为用户';s local提供多语言支持_Php_Datetime - Fatal编程技术网

Php 何时将UTC日期时间转换为用户';s local提供多语言支持

Php 何时将UTC日期时间转换为用户';s local提供多语言支持,php,datetime,Php,Datetime,我知道这个问题已经讨论过很多次了。快速的回答总是“越晚越好”。但我不确定多久它就会被视为坏习惯 我在我的应用程序中使用datetimes。如果我把它留到最后一刻,即在将数据发送到视图之前,我将不得不为每个日期时间重复编写无聊的代码,就像这样: $dateOBJ = new DateTime($date); $timezoneOBJ = new DateTimeZone($user_timezone); $dateOBJ->setTimezone($timezoneOBJ)->form

我知道这个问题已经讨论过很多次了。快速的回答总是“越晚越好”。但我不确定多久它就会被视为坏习惯

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

$dateOBJ = new DateTime($date);
$timezoneOBJ = new DateTimeZone($user_timezone);
$dateOBJ->setTimezone($timezoneOBJ)->format($my_format);
当我可以在脚本开头只做一次时:

date_default_timezone_set($user_timezone);
并在从UTC查询到用户的字段之后(或者在查询过程中,如果我使用SQL函数的话)立即将所有字段转换为用户的字段。因此,一个单一的模型例程将为我处理它,我再也不会担心它了,即使是表单输入

为什么会有这种不好的做法?

时间戳或日期/时间值是绝对的时间点,是人类历史上的精确点。不管时间戳是如何准确存储的,有许多格式都解析为同一时间点。
特定时区的人类可读时间格式和特定语言环境的格式只是向用户呈现该时间点的一种非常具体的方式。这本质上是表示层的事情,而不是模型正在处理的事情

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

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

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

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

或:

或:

$dateTimeFormatter=新的MyDateTimeFormatter($userLocale,$userTimezone);
...


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

根据我自己的意见,始终将时间保存在数据库中的固定时区,并在显示时根据用户时区显示时间。我不认为这是一种不好的做法。因为向用户显示自己时区的信息更相关。是的,这就是我提到UTC的原因。数据库日期时间为UTC。我只是看不到在查询时间转换时区会导致我的业务逻辑出现一致性问题的真实情况。在查询时间转换为用户时区并在业务逻辑中使用相同时区会导致一致性问题的真实情况是什么?当然,我认为代码太长,太重复,无法放入模板中。使用一个自定义函数来做所有这些可以缩短代码的事情,但是,另外一个函数调用调用了3个函数调用。考虑一个大数组迭代。如果我只是简单地在查询上转换时区,或者在查询之后转换时区,你能告诉我一些一致性问题的例子吗?就MVC而言,这只是常识上的关注点分离:在模型中的某个地方,你从数据库获取数据,在模型内部,你用数据库中的数据进行业务逻辑计算,在视图中显示数据。如果在从数据库中获取数据时格式化数据,则将演示逻辑混合到业务逻辑中,并且需要考虑业务逻辑中的不同时间戳表示。不管你怎么转,这都是一团糟。对于琐碎的代码来说,这可能很好,但在应用程序增长时就不行了。
<p><?php echo $myCustomDateObject->formatLocal($locale); ?></p>
$dateTimeFormatter = new MyDateTimeFormatter($userLocale, $userTimezone);

...

<p><?php echo $dateTimeFormatter->format($date); ?></p>