像普通整数一样减去数字字符
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
我有两个可以看作时间戳的字符串:
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