2014-04-04 44 views
0

我有一個表中,我已經在其中爲time類型秒爲例如:00:00:03,00:00:02等類型的每臺機器分配突發時間java代碼存儲幾毫秒到一個數組

我有一個JAVA代碼從數據庫中檢索這些突發時間並將其存儲在一個列表中,然後將每個突發時間轉換爲「毫秒」類型。

ArrayList<String>list22=new ArrayList<String>(); 
ResultSet rs = stmt1 
     .executeQuery("SELECT burst_time FROM virtual_machine WHERE VM_id <= 4"); 

while (rs.next()) { 
    list22.add(rs.getString("burst_time")); 
} 

String tempStamp = list22.get(0); 
int i; 

for(i=0;i<=list22.size()-1;i++){ 
    System.out.println(list22.get(i)); 
} 

for(String startstamp : list22){ 
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
    formatter.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
    java.util.Date d = null; 
    try 
    { 
     d = formatter.parse(startstamp);} 
    catch (java.text.ParseException e) { 
     System.err.println("Error: " + e.getMessage()); 
    } 

    long qtm= d.getTime(); 
    System.out.println(qtm); 
} 

這給了我以下結果:

00:00:03 
00:00:02 
00:00:02 
00:00:03 
3000 
2000 
2000 
3000 

現在我需要的值存儲那些毫秒陣列bur[],並用它在程序,使得相應的機器應該在指定的時間運行它存儲在數組中。

如果在數組中存儲毫秒並將其提供給機器,是否可以通過正確的路徑告訴我。

+1

一個小點 - 只處理持續時間時使用'TimeZone'有什麼意義? –

+0

P.S.感覺你正在做一些相對複雜的事情來獲得簡單的結果。 –

+0

什麼SQL類型是數據庫中的「burst_time」列? – Robert

回答

1

我修改代碼來避免NPE也加入bur[]陣列:

ArrayList<String>list22=new ArrayList<String>(); 
ResultSet rs = stmt1 
      .executeQuery("SELECT burst_time FROM virtual_machine WHERE VM_id <= 4"); 

while (rs.next()) { 
    list22.add(rs.getString("burst_time")); 
} 

for(int i=0;i<list22.size();i++){ 
    System.out.println(list22.get(i)); 
} 

long[] bur = new long[list22.size()]; 

for(int i=0;i<list22.size();i++){ 
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
    try 
    { 
     java.util.Date d = formatter.parse(list22.get(i)); 
     long qtm= d.getTime(); 
     bur[i] = qtm; 
     System.out.println(qtm); 
    } catch (java.text.ParseException e) { 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 
1

試試這個:

int bur[] = new int[list22.size()]; 
for(int i = 0; i < list22.size(); i++) { 
    String timeStamp = list22.get(i); 
    String s, m, h, split; 
    split = timeStamp.split(":"); 
    h = split[0]; 
    m = split[1]; 
    s = split[2]; 
    bur[i] = Integer.parseInt(s) * 1000 + Integer.parseInt(m) * 60000 + Integer.parseInt(h) * 3600000; 
} 

此解決方案不使用任何日期的對象,既然你贏了」如果我不是完全錯誤的方式,你需要他們;-)

+0

如果時間爲'00:01:03',該怎麼辦? – nikis

+0

@nikis:謝謝,更新我的回答 –

+0

手寫的解析器很好,因爲JDK不直接支持持續時間計算,但有一個錯誤:您應該使用3600000而不是1440000.而您的意思是字符串,而不是字符串? –

2

以下解決方案几乎與answer of @nikis相同,但保留重要的時區設置。否則,用戶將獲得一個驚人的經驗,如果這個代碼在英國(歐洲/倫敦)運行,因爲在1970年出現了夏時制 - 導致持續多頭有一個充分的小時太多:

long[] bur = new long[list22.size()]; 

for(int i=0; i < list22.size(); i++) { 
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 

    // important, but avoid deprecated Etc/GMT-notation 
    formatter.setTimeZone(TimeZone.getTimeZone("GMT")); 

    try 
    { 
     java.util.Date d = formatter.parse(list22.get(i)); 
     long qtm= d.getTime(); 
     bur[i] = qtm; 
     System.out.println(qtm); 
    } catch (java.text.ParseException e) { 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 

這裏,我已經提出了一個解決方法是在JDK 8之前不支持處理持續時間。事實是,SimpleDateFormat旨在解析時間點,但不是持續時間。因此,具有永不改變的固定起始點非常重要,因此選擇UTC時區和參考點1970-01-01T00:00:00,000Z(自UNIX紀元以來經過的毫秒數)。

JodaTime提供了一個專門的PeriodFormatter,這確實產生了org.joda.time.Period。否則可以編寫自己的專用字符串解析器(通過substring(),indexOf()等)的幫助來分解整數部分,然後使用Integer.valueOf(String),然後使用以下簡單公式計算長整數:(hour * 3600 + minute * 60 + second) * 1000

+0

非常感謝你的幫助和解釋:) – sb15