5

私の Roblox の場所では、実行中のすべてのサーバーとゲーム内の場所で一貫している現在の時刻を表す値を取得したいと考えています。

Time関数については既に知っていますが、その関数のドキュメントは、単一の場所 (またはおそらく単一の場所のインスタンスのみ?) でのみ一貫していることを示しているようです。

Returns returns the current place time in seconds.

ダニもあります:

UNIX エポック (1970 年 1 月 1 日) からの秒数である UNIX 時間で時間を返します。

しかし、それには別の問題があります。

一部のサーバーは異なるタイムゾーン (アメリカとヨーロッパのサーバーなど) で実行されるため、 tick() はそれらのサーバーで異なる時間を返します。この時間は時差がある分、数時間違います。このため、2 つのサーバー間の相対的な時間については何も言えません (プレイヤーが最後にアクセスしてからの経過時間の測定など)。

How do I get a time value that's consistent across all servers and places in my game? (The actual time in real life would work well for this purpose.)

4

2 に答える 2

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 エポック以降の現在のマイクロ秒が含まれるようになります。

時間が必要なたびに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()関数を呼び出すと、サーバーの時間ではなく、プレイヤーの時間が取得されることに注意してください。これは通常は必要ないかもしれませんが、プレーヤーがいるタイムゾーンを見つけたり、プレーヤーの現在の時刻を確認したりするために使用できます。

于 2014-06-10T04:57:08.220 に答える
2

議論しているRoblox Wikitickの記事が最近更新され、私の質問に答えるいくつかの追加情報が含まれるようになりました:

警告: tick() は現地時間を返します。サーバー間のタイム ゾーンは異なる場合があります。すべてのサーバーで同じ時刻を取得するための信頼できるオプションは、os.time() を呼び出すことです。

をグーグルで調べたos.time()ところ、実際には LUA 言語の標準ライブラリの一部であることがわかりました。との詳細についてはos、次のos.time場所を参照してください。

于 2014-06-14T19:56:12.787 に答える