2011-10-14 8 views
5

Tôi đang đọc giá trị dấu thời gian từ dữ liệu SensorEvent nhưng tôi không thể tính thời gian tham chiếu cho các giá trị này. tài liệu Android chỉ nói "Thời gian trong nano giây mà tại đó sự kiện này xảy ra" Như một ví dụ:Thời gian tham chiếu Dấu thời gian cảm biến Android

ngày thiết bị Android hiện tại của tôi, ngày 14 Tháng 10 2011 23: 29: 56,421 (GMT + 2)

System.currentTimeMillis * 1000000 (nanosec) = 1318627796431000000 (OK)

sensorevent.timestamp (nanosec) = 67578436328000 = 19 giờ 46 phút ????

Bạn có thể giúp tôi không?

nhờ

+0

Xem ở đây: http://stackoverflow.com/questions/3498006/sensorevent-timestamp-to-absolute-utc-timestamp – goto10

Trả lời

3

Dường như những gì bạn đang đối phó với là số nano giây kể từ khi hệ điều hành bắt đầu, còn được gọi là "thời gian hoạt động".

thông tin sâu hơn về vấn đề này: http://code.google.com/p/android/issues/detail?id=7981

tôi nên thêm rằng vấn đề liên quan SensorEvent.timestamp to absolute (utc) timestamp? giao dịch với cùng một vấn đề và là nơi tôi tìm thấy câu trả lời.

+1

Cảm ơn goto10 và manu3d, cuối cùng câu trả lời là rằng thời gian timestamp là thời gian hoạt động của thiết bị trong nanosecs. –

+2

Nó không phải lúc nào. Trên Nexus 4 của tôi, nó là nano giây kể từ kỷ nguyên (bắt đầu năm 1970). Có lẽ nó có thể được suy ra bằng cách giả định rằng SensorEvent sẽ được xử lý nhanh chóng và thử nghiệm nó chống lại thời gian hoạt động và bắt đầu năm 1970. – davtom

1

Tôi biết rằng đó là một câu hỏi rất cũ, nhưng, tôi cũng đang đấu tranh để chuyển đổi SensorEvent.timestamp thành thời gian có thể đọc được của con người. Vì vậy, tôi đang viết ở đây những gì tôi đã hiểu cho đến nay và làm thế nào tôi đang chuyển đổi nó để có được giải pháp tốt hơn từ các bạn. Mọi bình luận sẽ được hoan nghênh.

Như tôi đã hiểu, SensorEvent.timestamp là thời gian trôi qua kể từ khi khởi động thiết bị. Vì vậy, tôi phải biết thời gian hoạt động của thiết bị. Vì vậy, nếu có một khởi động lại thiết bị API, nó sẽ rất dễ dàng, nhưng, tôi đã không tìm thấy nó. Vì vậy, tôi đang sử dụng SystemClock.elapsedRealtime()System.currentTimeMillis() để 'ước tính' thời gian hoạt động của thiết bị. Đây là mã của tôi.

private long mUptimeMillis; // member variable of the activity or service 
... 
atComponentsStartUp...() { 
    ... 
    /* Call elapsedRealtime() and currentTimeMillis() in a row 
     in order to minimize the time gap */ 
    long elapsedRealtime = SystemClock.elapsedRealtime(); 
    long currentTimeMillis = System.currentTimeMillis(); 

    /* Get an uptime. It assume that elapsedRealtime() and 
     currentTimeMillis() are called at the exact same time. 
     Actually they don't, but, ignore the gap 
     because it is not a significant value. 
     (On my device, it's less than 1 ms) */ 
    mUptimeMillis = (currentTimeMillis - elapsedRealtime); 
    .... 
} 
... 
public void onSensorChanged(SensorEvent event) { 
    ... 
    eventTimeMillis = ((event.timestamp/1000000) + mUptimeMillis); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(eventTimeMillis); 
    ... 
} 

Tôi nghĩ tính năng này hoạt động đối với Ứng dụng là lỗi thời gian một phần nghìn giây. Xin vui lòng, để lại ý tưởng của bạn.

+0

SystemClock.elapsedRealtimeNanos() là API bạn đang tìm kiếm, sensorTimeStamp trong tham chiếu giờ địa phương của thiết bị = Hệ thống .currentTimeMillis() + ((event.timestamp-SystemClock.elapsedRealtimeNanos())/1000000L); –

+0

Bạn có thấy rằng mUptimeMillis thay đổi theo thời gian (chỉ trong một lần khởi động) không? Bạn đã sử dụng chức năng nào cho atComponentsStartUp? –