用于将毫秒存储到数组中的java代码

时间:2014-04-04 14:26:18

标签: java

我有一张表,其中我为每台机器分配了time类型的爆发时间,例如:00:00:03,00:00:02等。

我有一个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[]中并在程序中使用它,以便相应的机器应运行存储在数组中的指定时间。

请告诉我,如果将数毫秒存储在数组中并将其交给机器,我是否正在通过正确的路径。

3 个答案:

答案 0 :(得分: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 pre 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

答案 1 :(得分: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());
     }
 }

答案 2 :(得分: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;
}

此解决方案不使用任何日期对象,因为如果我不是完全错误的话,你不需要它们; - )