Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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 发送/接收日期时,服务器或客户端是否应处理时区?_Php_Asp.net_Date_Datetime_Timezone - Fatal编程技术网

Php 发送/接收日期时,服务器或客户端是否应处理时区?

Php 发送/接收日期时,服务器或客户端是否应处理时区?,php,asp.net,date,datetime,timezone,Php,Asp.net,Date,Datetime,Timezone,我知道最佳做法是将UTC日期/时间存储在我们的数据库中,并在用户的本地时区向用户显示。我们将存储时区而不是偏移量,以便支持夏令时 处理时区的最佳方式是什么 选项1:服务器只讲UTC,客户端转换为时区 以HTML格式发送到浏览器的所有日期均以UTC为单位。客户端将使用moment.js或类似工具将UTC时间转换为正确的时区。将使用数据库中指定的时区,而不是浏览器的本地时间,因为这可能不正确 当用户提交日期或时间时,必须先将其转换为UTC时间,然后才能提交到服务器 选项2:服务器转换为时区 所有计算

我知道最佳做法是将UTC日期/时间存储在我们的数据库中,并在用户的本地时区向用户显示。我们将存储时区而不是偏移量,以便支持夏令时

处理时区的最佳方式是什么

选项1:服务器只讲UTC,客户端转换为时区 以HTML格式发送到浏览器的所有日期均以UTC为单位。客户端将使用moment.js或类似工具将UTC时间转换为正确的时区。将使用数据库中指定的时区,而不是浏览器的本地时间,因为这可能不正确

当用户提交日期或时间时,必须先将其转换为UTC时间,然后才能提交到服务器

选项2:服务器转换为时区 所有计算仍然以UTC进行,并且日期/时间在最后可能的时刻转换为正确的时区,例如以HTML输出日期时

当客户提交任何日期/时间时,应立即将其转换为UTC


还有其他方法吗?两种方法都是有效的,但每种方法都有优点和缺点。有几件事需要考虑:

  • JavaScript的本机时区转换仅限于运行它的机器的本地时区,而且也是。如果您计划在客户机中转换值,则需要。我个人推荐

  • 转换客户机中的值(使用任何库)将需要时区数据,如果您想要支持世界上所有的时区,那么时区数据可能会有点大。您可能需要考虑将数据限制到满足您的要求的最小子集。

  • 服务器端时区转换还需要有效的时区数据。PHP内置了这一功能,您可以随时更新

  • 您还使用ASP.Net标记了您的问题。Net包括
    TimeZoneInfo
    ,它只提供对Microsoft时区的支持。如果您想要标准的IANA时区(如PHP中使用的时区),那么您需要一个库。我推荐。您可以在中阅读更多关于不同时区的信息

  • 如何交付最终结果取决于您编写的应用程序的类型

    • 如果您正在创建一个“传统”网页,其中HTML呈现在服务器端,那么您将呈现一个人类可读的字符串。这意味着不仅要了解时区,还要了解用户的区域设置,以便使用文化上合适的格式

      这与时区完全无关。例如,您可能是美国人,使用MM/DD/YYYY格式,但仍然位于欧洲并使用欧洲时区

    • 如果您的服务器通过API(即JSON、XML等)交付结果,那么您的结果应该是机器可读的。最好使用该格式。具体而言,时间戳应按照中所述交付

      这意味着它们应始终包括
      Z
      (UTC值)或偏移量(本地值)。因此,您可以考虑用户的时区,但您提供的结果应该包括本地偏移,因此它是明确的

      例如,您有UTC值
      2014-07-09T12:00:00Z
      ,然后在
      America/Los_Angeles
      中,它是
      2014-07-09T05:00:00-07:00
      ,这就是应该通过API交付的值

      在客户端,您可以使用类似的库为用户呈现该值。例如:

      var s = moment.parseZone("2014-07-09T05:00:00-07:00").format("LLL");
      

相关:

您应该始终从
htaccess
或从服务器
php.ini
设置
UTC
。此外,在数据库中,日期应为
UTC
。这样所有的日期都是一样的。您可以使用
MySQL
PHP
来操作日期,而无需转换。唯一的转换发生在您向用户列出日期时。@machineaddict我在问,在客户端还是服务器端转换日期是最佳做法。i、 e.我们是让服务器只说UTC还是也处理时区转换?根据我上面解释的方法,日期完全从服务器端处理。因此,服务器只在
UTC
@machineaddict中进行会话如果服务器只在UTC中进行会话,那么我们依靠Javascript更改页面加载上的日期字符串?如果您的用户已注册,他们可以选择自己的时区。如果用户是来宾,您可以使用javascript更改日期以响应他们的计算机时区,显示服务器时区,或者您可以从他们的ip猜测他们的时区。一个想法是看看
vBulettin
phpBB
之类的脚本如何根据用户状态(来宾/登录)处理时间。我的下一个项目必须是这样的,所以我可能会在其中实现您的最佳答案。