我有一张表,其中我为每台机器分配了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[]
中并在程序中使用它,以便相应的机器应运行存储在数组中的指定时间。
请告诉我,如果将数毫秒存储在数组中并将其交给机器,我是否正在通过正确的路径。
答案 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;
}
此解决方案不使用任何日期对象,因为如果我不是完全错误的话,你不需要它们; - )