如何使用c++和PHP在客户端和云服务器之间正确存储时间戳和偏移量



我有一个由远程单元组成的物联网架构,它从多个传感器收集数据,并使用sqlite3数据库在本地存储数据。这些数据不时被上传到云服务器上。在云服务器上有一个web应用程序,显示所有上传数据的日志和结果。

到目前为止,我需要正确处理日期时间和时区,以避免信息混合,并保证正确的数据重建按时。从现在起,我一直只使用UTC日期时间来处理数据,但现在我需要构建一种处理时区的方法。我把这篇文章作为一个一般的指导方针。

我的远程设备运行嵌入式linux,我的远程软件是用c++构建的。因此,每次我需要获得datetime时,我调用std::chrono::system_clock::now(),无论设置哪个时区,都返回UTC时间(根据我的另一个问题的答案,这个想法被认为是真)。

今天,我的本地和远程数据库只存储一个值,即seconds_since_epoch,转换为毫秒,代码如下:

int64_t TimePointToDb(const std::chrono::time_point<std::chrono::system_clock> &time)
{
    auto count = time.time_since_epoch();
    auto value = std::chrono::duration_cast<std::chrono::milliseconds>(count);
            return value.count();
}

返回值存储在sqlite3字段(所有sqlite3字段都是strings),然后上传到mysql bigint格式。

在基于PHP构建的云服务器上,使用以下命令将bigint转换为人类可读的格式:

$dt = new DateTime();
$dt->setTimeStamp(value);
$dt->format("Y-m-d H:i:s");

其中valuebigint的存储值。

目前,没有处理时区或时间偏移,这就是我需要帮助的地方。

据我所知,我需要在本地sqlite3和云mysql上创建一个新的数据库字段来存储时间偏移量(不是时区,因为日光可能会改变时区)。

我的问题是:

  • a)这是处理时区的"最佳实践"或"推荐"方法吗?

  • b)在c++中,如何获得系统的当前时间偏移?

  • c)在sqlite3mysql中存储此时间偏移的格式是什么?继续使用unix日期时间?如何将时区转换为unix日期时间?

  • d)在云中,PHP如何显示正确的时间,现在考虑时间偏移?

"最佳实践"是始终在任何地方存储UTC时间。这些时间戳只需要在用户界面中转换为本地时间。也就是说,在你的网页,应用程序窗口支付数据等,所以时区只在显示时使用,而不是当存储时间时使用。

相关内容

  • 没有找到相关文章

最新更新