如何获取 Roblox 中的当前时间(在所有服务器上保持一致)?

Posted

技术标签:

【中文标题】如何获取 Roblox 中的当前时间(在所有服务器上保持一致)?【英文标题】:How do I get the current time in Roblox (consistent across all servers)? 【发布时间】:2014-07-30 16:12:51 【问题描述】:

在我的 Roblox 地方,我想获得一个代表当前时间的值,该值在我的游戏中所有正在运行的服务器和地方都是一致的。

我已经知道Time 函数,但该函数的文档似乎表明它只在一个地方(或者可能只有一个地方实例?)是一致的:

Returns returns the current place time in seconds.

还有tick:

以 UNIX 时间返回时间,即自 Unix 纪元 1970 年 1 月 1 日以来的秒数。

但这还有另一个问题:

由于某些服务器运行在不同的时区(例如美国和欧洲的服务器),tick() 将在这些服务器上返回不同的时间。这个时间会在几个小时内有所不同,就像时区差异一样大。由于这个事实,它无法说明两台服务器之间的相对时间(例如测量自玩家上次访问以来所用的时间)。

如何在我的游戏中的所有服务器和地点获得一致的时间价值? (现实生活中的实际时间很适合这个目的。)

【问题讨论】:

*** 似乎不是问 Roblox 问题的地方(因为它不专业)。最好在 Roblox 论坛中提问。 @CodigosTutoriales 这是一个活跃的标签,拥有约 200 个关注者和 >200 个问题。 Roblox 问题在这里很好,只要它们实际上与编程有关。我非常喜欢这个网站而不是一般的论坛,for a variety of reasons。 【参考方案1】:

因为 ROBLOX 服务器可以使用不同的时区,所以您只需要使用一个您知道它使用哪个时区的服务器。

要从外部服务器获取数据,您需要使用HttpService。

如果您有自己的服务器,则可以使用它来获取当前时间,如果没有,您可以寻找可以提供当前时间的服务器。

这是一个关于如何获取当前时间的示例:

local TimeServer = "http://www.timeapi.org/utc/now?%25Q"
local CurrentTime = Game:GetService("HttpService"):GetAsync(TimeServer, true)
local ServerTime = tick()

这将使“CurrentTime”变量包含自 Unix 纪元以来的当前微秒。

你不想每次都使用HttpService,所以你想使用这样的东西:

function getTime()
    return CurrentTime - (ServerTime * 1000) + tick()
end

但为了提高效率,请将其放在 Game.ServerScriptService 中名为“Time”的 ModuleScript 中:

local TimeServer = "http://www.timeapi.org/utc/now?%25Q"
local CurrentTime = tonumber(Game:GetService("HttpService"):GetAsync(TimeServer, true))
local ServerTime = tick()

return function() return (CurrentTime / 1000) - ServerTime + tick() end

然后您可以在任何脚本中使用它,如下所示:

local getTime = require(Game.ServerScriptService.Time)

print(getTime())
wait(1)
print(getTime())

需要注意的是,如果您从LocalScript 调用tick() 函数,您将获得玩家的时间,而不是服务器的时间。 这可能不是您通常想要的,但它可用于查找玩家所在的时区,或查看玩家的当前时间。

【讨论】:

我终于有机会测试了它,它工作得很好。 Roblox Wiki 最近更新了一个更好的解决方案,尽管它不依赖于像 timeapi.org 这样的外部服务。 @Ajedi32 啊,os.time()确实更好【参考方案2】:

Roblox Wiki article discussing tick 最近已更新,包含一些回答我问题的附加信息:

警告:tick() 返回本地时间,服务器之间的时区可能会有所不同。在每台服务器上获取相同时间的可靠选项是调用 os.time()。

在搜索os.time() 之后,我发现它实际上是 LUA 语言标准库的一部分。更多关于osos.time的信息可以在这里找到:

OsLibraryTutorial LUA 5.1 Reference: os.time

【讨论】:

以上是关于如何获取 Roblox 中的当前时间(在所有服务器上保持一致)?的主要内容,如果未能解决你的问题,请参考以下文章

roblox 中的单独位置数据存储如何工作?

如何使脚本影响 Roblox LUA 中的所有子级?

从roblox中的dataStore获取数据的问题

如何在 roblox 中删除所有克隆的 gui

循环中的 Roblox Studio Lua if 语句

Python - 发送 __doPostBack(加入 Roblox 中的群组)