我有两个可以看作时间戳的字符串:
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;
所以这就是问题所在。如果在时间戳中有日期,如何完成工作?
答案 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处的元素提供的信息比你需要的更多......
但正如我之前所说,你走的是错误的道路,不要发明轮子,看看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