2

私は何が間違っているかを見つけました:

したがって、どうやらhttp://www.epochconverter.com/は入力値の精度を仮定しており、それらの仮定から値841073068は 1996/1997 になります。その正確な日付につながる仮定が何であるかはわかりませんが、正直なところ気にしません。

付属のデバッガーを使用して呼び出しnew Date(System.currentTimeMillis())たところ、1070 年 1 月 10 日の日付が正しく表示されました。つまり、時計が狂ったように飛び出していません。

元の質問:

Android for と IoT ケース (このhttps://developer.qualcomm.com/hardware/dragonboard-410c ) を備えたシングルボード コンピューターを実行しています。動作する OS は、Qualcomm が提供するプレーンなバニラ Android です。

現在、ボードを一度に長期間実行したままにする信頼性をテストしていますが、説明が見つからない非常に奇妙な動作が見られます。

ボードは 10 日前に電源を入れましたが、インターネットにアクセスできません (WiFi はオンになっていますが、アクセス ポイントのセットアップもイーサネットもありません)。Bluetooth がオンになっており、オフィスには iBeacons と Eddystone があります。また、エリアにはWiFiがあります。

に移動しSettings -> Date and Timeたり、通知シェードを確認したり、時計アプリやカレンダー アプリに入ったりすると、1970 年 1 月 10 日と表示されます。

その上のアプリには、常に実行されているサービスがあり、データ処理とディスク ロギング (デバッグ用) を行います。

System.currentTimeMillis()ログから、ボードが最初に電源を入れられたときに期待値を返していたことがわかります。つまり、ログの先頭はエポック タイムが 1970 年 1 月であることを示しています。

しかし、ログの最後 (およびライブ プロセスにデバッガーをアタッチ) では、 の値はSystem.currentTimeMillis()1996 年 9 月/10 月のどこかにあります。値の例: 841073068, 841263234,841579239

だから私の質問は:

  • ここで何が起きてるの?
  • 価値が変化した理由System.currentTimeMillis()と、それを変えた可能性のあるものは何ですか?
  • Android UI (通知、時計アプリ、設定) にまだ 1970 が表示されるのはなぜですか? 彼らはどこからこの値を取得していますか?

編集:

回答には混乱があり、私の質問には詳細が欠けていたことがわかります。

時間差は測りたくない。実際のタイムスタンプが必要です。これらの値は、Bluetooth LE イベントとともに POST 経由でバックエンドに報告されます。この「ネットワークなし」のことは、ボードで実行している信頼性テストですが、ほとんどの場合ネットワークがあると予想され、ボードは通常の Android の方法を使用してネットワークから時間を自動更新する必要があります。

現在のテストのバッチで、何がうまくいかなかったのか、その理由を理解しようとしています。

4

2 に答える 2

1

ご存知のように、現在のシステム時刻 ( System.currentTimeMillis()) は、必要に応じて任意のプロセスで変更できます。別のプロセスによって変更された可能性は十分にあります。稼働時間を測定する信頼できる方法ではありません。

私は次のようなものを評価します:

SystemClock.uptimeMillis()

これは、デバイスが起動してからの経過時間 (ミリ秒単位)を返します(ディープスリープに費やされた時間は含まれません)。

また、Bluetooth が何らかの関係があると思われることも言及したいと思います。Bluetooth は、SSL と同じようにペアリングとセキュリティにシステム時間を使用していると想像できます (ただし、私は専門家ではありません)。GPS を使用して UTC 時刻の値を取得できるため、GPS も問題になる可能性がありますが、ボードに GPS モジュールがあるかどうかはわかりません。

あなたの編集について:

有効なタイムスタンプを取得するのは非常に簡単です。つまり、サーバー時間からボードから報告された経過時間を差し引いたものです。System.currentTimeMillis()ただし、によって報告された時間を受け入れるか、代わりに経過時間を使用することを選択することをお勧めします。私が働いている会社では、組み込みの Android デバイスも使用しており、サーバー ダッシュボードでは稼働時間 (以降) と現在のデバイス時間の両方を確認できますが、少なくとも私の意見では、特にSystem.currentTimeMillis()変更される可能性があり、夏時間と冬時間の影響を受けます。

于 2017-01-02T10:45:28.100 に答える
0

何かを測定したい場合は、試してみてくださいSystem.nanoTime()。ここに違いがあります - https://stackoverflow.com/a/351571/2793494

于 2017-01-02T10:53:24.450 に答える