减去正常整数之类的数字字符

时间:2017-05-10 08:06:06

标签: java string subtraction

我有两个可以看作时间戳的字符串:

String min="2017-04-15 13:27:31";
String max="2017-04-15 13:40:01";

假设我们想要找出从第一个时间戳到第二个时间戳的时间。如果只有时间并且没有包含日期​​,我可以使用以下代码获取它:

                String[] partsMin=min.split(":");
                String[] partMax=max.split(":");
                int diffZero=Integer.parseInt(partMax[0])-Integer.parseInt(partsMin[0]);                
                int diffOne=Integer.parseInt(partMax[1])-Integer.parseInt(partsMin[1]);
                int diffOTwo=Integer.parseInt(partMax[2])-Integer.parseInt(partsMin[2]);
                diffInSec=diffZero*3600+diffOne*60+diffOTwo;

所以这就是问题所在。如果在时间戳中有日期,如何完成工作?

5 个答案:

答案 0 :(得分:2)

我会从中构造LocalDateTime实例。 然后我会从它获得毫秒并从EndTime中减去startTime。 剩下的是两者之间传递的毫秒数。 DateTimeFormatter也可以用于此目的。

String strMin = "2017-04-15 13:27:31";
DateTimeFormatter formatterTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTimeMin = LocalDateTime.parse(strMin, formatter);

String strMax = "2017-04-15 13:40:01";
LocalDateTime dateTimeMax = LocalDateTime.parse(strMax, formatter);

long minutes = ChronoUnit.MINUTES.between(dateMin, dateMaxto);
long hours = ChronoUnit.HOURS.between(dateMin, dateMax);

如果你想得到毫秒:

long millisPassed = dateMax.toEpochMilli() - dateMax.toEpochMilli();

答案 1 :(得分:1)

在您的代码中执行此操作:

int diffZero=Integer.parseInt(partMax[0])

与做:

相同
int diffZero=Integer.parseInt("2017-04-15")

生成异常(NumberFormatException)

你应该更好地尝试 PARSE 将这些字符串的最小值和最大值转换为日期

编辑:

你可以检查你的代码/变量:并且看到拆分为“:”并没有回复正确的数组,因为索引0处的元素提供的信息比你需要的更多......

enter image description here

但正如我之前所说,你走的是错误的道路,不要发明轮子,看看java对我们使用的API有多实用:

String min = "2017-04-15 13:27:31";
String max = "2017-04-15 13:40:01";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTimeMin = LocalDateTime.parse(min, formatter);
LocalDateTime dateTimeMax = LocalDateTime.parse(max, formatter);
long days = ChronoUnit.DAYS.between(dateTimeMin, dateTimeMax);
long minutes = ChronoUnit.MINUTES.between(dateTimeMin, dateTimeMax);

System.out.println(days);
System.out.println(minutes);

答案 2 :(得分:1)

使用java日期时间库(即使旧的Date类也可以)将字符串解析为适当的对象。

根据您选择的日期时间库,您可以查看它们之间的区别。最简单的是:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 Date date1 = sdf.parse(str1);
 Date date2 = sdf.parse(str2);
 long differenceInSeconds = (date2.getTime()-date1.getTime())/1000;

新的Java 8时间类也允许你这样做,并且更好地学习前进。我无法记住这个问题的语法。

答案 3 :(得分:1)

您是否尝试过更换字符串的所有其他部分,如下所示:

String[] partsMin = min.replaceAll("\\d+-\\d+-\\d+", "").trim().split(":");
String[] partMax = max.replaceAll("\\d+-\\d+-\\d+", "").trim().split(":");

答案 4 :(得分:0)

使用SimpleDateFormat来解析日期字符串,并对Date结果执行操作,您将获得正确的值。这适用于“2017-02-28 23:59:59'”之间的日期。和' 2017-03-01 00:00:01'

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = format.parse("2017-02-28 23:59:59");
Date date2 = format.parse("2017-03-01 00:00:01");

long time1 = date1.getTime();
long time2 = date2.getTime();

long diff = time2 - time2; // should be 2000