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

时间:2014-06-10 02:13:55

标签: roblox

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

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

Returns returns the current place time in seconds.

还有tick

  

返回UNIX时间的时间,这是自1970年1月1日Unix时代以来的秒数。

但这有另一个问题:

  

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

如何在游戏中的所有服务器和位置获得一致的时间值? (现实生活中的实际时间可以很好地用于此目的。)

2 个答案:

答案 0 :(得分:5)

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

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

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

以下是如何获取当前时间的示例:

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

这将使" CurrentTime"变量包含自Unix Epoch以来的当前微秒。

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

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

但为了提高效率,请将其放在Game.ServerScriptService中的ModuleScript中,调用" Time" :

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())

需要注意的是,如果您从tick()拨打LocalScript功能,您将获得播放器的时间,而不是服务器的时间。 这可能不是您通常想要的,但它可以用来查找玩家所在的时区,或者查看玩家当前的时间。

答案 1 :(得分:2)

Roblox Wiki article discussing tick最近已更新,其中包含一些可以回答我问题的其他信息:

  

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

在Google搜索os.time()之后,我发现它实际上是LUA语言标准库的一部分。有关osos.time的更多信息,请访问: