像普通整数一样减去数字字符

Subtract char of digits like normal integers

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

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;

所以问题来了。如何在时间戳内有日期的情况下完成工作?

在您的代码中这样做:

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

等同于:

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

正在生成异常 (NumberFormatException)

你最好尝试 PARSE 那些字符串最小值和最大值

编辑:

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

但正如我之前所说,您走错了路,不要重新发明轮子,看看使用 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);

我会从中构建 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();

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

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

 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 次 classes 也可以让你做到这一点,并且更好地学习前进。不过我记不起那个语法了。

您是否尝试过像这样替换字符串的所有其他部分:

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

使用SimpleDateFormat解析日期字符串,对日期结果进行运算,得到正确的值。这适用于“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