【问题标题】:how to adjust timestamp difference of client and server?如何调整客户端和服务器的时间戳差异?
【发布时间】:2016-01-03 10:59:49
【问题描述】:

向用户显示消息“发送时间”的最佳方式是什么? 使用“服务器端 time() 函数”保存更好还是使用“客户端 getTime()”保存并使用 ajax 更新该值更好?

【问题讨论】:

  • 一般情况下你会使用服务器时间,因为用户可以在他/她的计算机上设置任何日期和时间,这使得它不是很可靠。
  • 如果服务器和客户端位于不同的时区,请将其中一个时区设置为与另一个相同或使用时区差异(例如 +2 小时)并相应地调整所有日期到其中之一(通过添加/减去时区差异)
  • 另外,客户端可以始终显示服务器发送的日期,您就完成了
  • 假设我们在 4:39 发送消息,但由于服务器在不同的时区,我们可以将发送时间显示为 5:39。如何解决这个问题?
  • 为此,您需要为您的客户引入某种形式的“语言环境”。您根据服务器时间存储时间戳,并根据客户端区域设置即时转换它们。

标签: javascript php


【解决方案1】:

如果服务器和客户端位于不同的时区,请将其中一个时区设置为与另一个相同或使用时区差异(例如 +2 小时)并根据其中一个调整所有日期(通过添加/减去时区差异)

或者,客户端可以始终显示服务器发送的日期,然后您就完成了

例如,如果您有服务器时区差异,只需将其显示在客户端中(并且您不需要任何其他内容,如果这对您的用例有好处)

2016-01-03 17:12:00 (+1 GMT)

你的例子:

在客户端(或服务器,但不是两者)中添加时区差异(+ 1 小时)

例如在服务器中 (php DateTime)

$server_date = date('Y-m-d H:i:s');
$client_date = DateTime::createFromFormat( 'Y-m-d H:i:s', $server_date );
$client_date->add( new DateInterval('PT'.(60*60).'S') ) // + 1 hour
$client_date = $client_date->format('Y-m-d H:i:s');

或在客户端(js 使用类似moment.jsDateX 的库)

var client_date = new Date(timestamp(server_date, 'Y-m-d H:i:s')+60*60*1000); // + 1 hour;
// timestamp is supposed to parse the date and return a unix timestamp in milliseconds
// for example if you use DateX, you can do:
// client_date = new DateX(DateX.fromString(server_date,'Y-m-d H:i:s').getTime()+60*60*1000).format('Y-m-d H:i:s');

第三个选项是让服务器始终发送 UTC (GMT) 日期,并让客户端将它们转换为本地/时区日期(类似于上述,只有客户端使用自己的时区偏移量而不是硬编码,例如+1 小时)

【讨论】:

    【解决方案2】:

    服务器是您唯一可以控制的机器,因此它是您唯一可以依赖的机器。但要注意夏令时。

    我建议在服务器上以 UTC 存储所有日期,然后在浏览器中转换为本地时间。这样做还可以帮助您考虑夏令时的变化,这些变化发生在世界各地的不同时间。

    为了说明这一点,如果您在服务器端执行此操作,则以下 C# 代码将 UTC 转换为本地时间,并考虑夏令时:

    DateTime utc = DateTime.UtcNow;
    TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
    

    我知道这是一个 PHP 问题,但我希望这段代码有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多