2015-10-19 119 views
1

我有很多時間戳記顯示用戶何時進入房間。我想計算一個平均時間。當一些行動發生在晚上時會發生問題。 我試圖用milis來計算它,但它是錯誤的。用約達時間計算平均時間

ArrayList<String> times = new ArrayList<String>(); 

    times.add("00:20:01"); 
    times.add("00:00:01"); 
    times.add("23:40:01"); 
    times.add("23:20:01"); 
    times.add("23:20:01"); 
    times.add("00:20:01"); 
    times.add("23:40:01"); 
    times.add("23:40:01"); 
    times.add("00:00:01"); 
    long commonMillis=0; 
    for (String date:times){ 
     LocalTime time = new LocalTime(date); 
     long dayMilis = time.getMillisOfDay(); 
     commonMillis = commonMillis + dayMilis; 
    } 
    LocalTime average = new LocalTime(commonMillis/times.size()); 

此代碼例如返回值14:08:54.333。因爲以毫秒計算的小時數00:00 and 23:00彼此相距太遠。

請幫我找到正確的方法來計算平均時間?

+0

它以毫秒爲單位而言是正確的,但如果我想知道,當一個人在平均走進一個房間時,我想看到的東西就像00:00(23:00到01:00之間) – user2957954

+1

那麼你應該不是平均Instants而是LocalTimes。 LocalTime不是時間戳。即時是。無法知道23:00是前一天還是當天01:00。 –

+0

您的預計時間是? – flo

回答

0

三件事:

  1. 你必須定義一個偏移時間:如果你想的不同天時間平均不知道當天
    ,你必須自己定義一個偏移時間。這個時間用來決定時間是否屬於第二天。
    此偏移時間可能取決於您獲得的值。
    沒有偏移時間,你隱式地使用0點。

  2. 避免溢出:
    如果您times名單變得更長,你可能會遇到溢出如果long場不足以存儲累計值。您可以使用像BigInteger這樣的溢出抵抗的數據結構或使用(culmulative) moving average方法。

  3. 的錯誤結果的構造函數:
    構造LocalTime(long instant)隱含使用本地DateTimeZone從一個Instant計算本地時間。這會在不同時區之間使用相同的代碼時導致不同的時間。
    您要使用的方法是LocalTime#fromMillisOfDay

這是考慮了以上幾點做法:

long movingAverage = 0; 

    // 1. define offset 
    LocalTime offset = new LocalTime("12:00:00"); 
    long offsetMillis = offset.getMillisOfDay(); 

    for (String date : times) { 
     long sampleMillis = new LocalTime(date).getMillisOfDay(); 

     // align to offset 
     if (sampleMillis < offsetMillis) 
      sampleMillis += DateTimeConstants.MILLIS_PER_DAY; 

     long diff = sampleMillis - offsetMillis; 

     // 2. use moving average 
     movingAverage = movingAverage + diff/times.size(); 
    } 

    // 3. avoid LocalTime(long) constructor 
    LocalTime result = offset.plusMillis((int) movingAverage); 
    System.out.println(result); // 23:48:54.329 
+0

非常感謝你!它完美的作品! – user2957954

0

一個幼稚的方法是收集所有日期中的long毫秒值,將它們相加並將它們除以日期數,然後將它們轉換回LocalDate。不過,您可能需要一個BigInteger來保存總和。