從 0 到 1,打造自己的遊戲後端服務
  • 簡介
  • 基礎服務
    • 架構介紹
    • Data 服務
    • API 服務
      • 在 Parse 服務架構簡易的 Cloud Code 部署機制
    • Notification 服務
      • Parse 推送服務設定與測試
    • Job 服務
      • 在 Parse 上透過 Cron 配置常用的 Scheduler
    • Email 服務
    • SMS 服務
    • Hosting 服務
    • Realtime 服務
      • Parse Live Query 設定
    • Information 服務
      • Parse Config 與 Firebase Remote Config 服務介紹
      • Connectivity 取得與監聽
      • Time 服務介紹與實作方法
      • IP 資料庫能獲得什麼資料
  • 遊戲服務
    • Achievement 成就系統
      • 設計簡易的成就系統 - 透過 Parse
    • Leaderboard 排行榜系統
      • 設計簡易的公開排行榜系統 - 透過 Parse
    • Pairing 配對系統
      • 設計簡易的 Dispatcherless 自動配對機制 - 透過 Firebase Realtime Database
    • Turn-based Multiplayer 回合制多人遊戲
      • 簡易的回合制多人遊戲系統 - 透過 Parse
    • Real-time Multiplayer 即時多人遊戲
      • 設計簡易的即時多人遊戲傳輸通道 - 透過 Firebase Realtime Database
  • 附錄 Self-Hosted Parse
    • Parse 服務架設
    • 建立 Parse 資料庫服務
    • 建立 Parse 服務
Powered by GitBook
On this page
  • 透過第三方 API
  • 透過 Express 直接在 Parse Server 提供 Time 服務
  • 透過 Firebase Realtime Database 取得 Server Time
  1. 基礎服務
  2. Information 服務

Time 服務介紹與實作方法

透過第三方 API

市面上有眾多提供時間的 API,大部分頭提供有 REST API 可供存取,以下是一家免費服務商的範例,透過 API 取得目前的 Unixtimestamp

  • 送出請求

http://www.convert-unix-time.com/api?timestamp=now
  • 取得回應

{  
   "localDate":"Monday 5th March 2018 02:22:11 PM",
   "utcDate":"Monday 5th March 2018 02:22:11 PM",
   "format":"l jS F Y h:i:s A",
   "returnType":"json",
   "timestamp":1520259731,
   "timezone":"UTC",
   "daylightSavingTime":false,
   "url":"http:\/\/www.convert-unix-time.com?t=1520259731"
}

透過 Express 直接在 Parse Server 提供 Time 服務

若您架設有 Parse 伺服器,也可以透過伺服器直接掛載一個端口來讓使用者取得伺服器時間

  • 將 /time 掛載時間值回傳

var app = express();
// ...
app.use('/time', function(req, res){
    res.end("" + new Date().getTime());
});

透過 Firebase Realtime Database 取得 Server Time

若您的服務架設在 Firebase Realtime Database 之上,您也可以透過伺服器 Clock Skew 功能,來取得本地端時間與伺服器端時間的時間差,即可推估精準的伺服器時間

// Android
DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    double offset = snapshot.getValue(Double.class);
    double estimatedServerTimeMs = System.currentTimeMillis() + offset;
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});
// iOS: Objective-c
FIRDatabaseReference *offsetRef = [[FIRDatabase database] referenceWithPath:@".info/serverTimeOffset"];
[offsetRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
  NSTimeInterval offset = [(NSNumber *)snapshot.value doubleValue];
  NSTimeInterval estimatedServerTimeMs = [[NSDate date] timeIntervalSince1970] * 1000.0 + offset;
  NSLog(@"Estimated server time: %0.3f", estimatedServerTimeMs);
}];
// iOS: Swift
let offsetRef = Database.database().reference(withPath: ".info/serverTimeOffset")
offsetRef.observe(.value, with: { snapshot in
  if let offset = snapshot.value as? TimeInterval {
    print("Estimated server time in milliseconds: \(Date().timeIntervalSince1970 * 1000 + offset)")
  }
})
PreviousConnectivity 取得與監聽NextIP 資料庫能獲得什麼資料

Last updated 6 years ago