我需要找到例如12:09:47到14:20:55的2个特定时间之间所有可能的时间组合(hh:mm:ss)中存在的唯一数字。我目前正在执行以下操作:
(Set<Integer> uniqueDigits = new TreeSet<Integer>();)
但是在增加59秒之后,我又如何增加分钟和小时数直到时间范围结束?
到目前为止,我有以下代码:
public int timeCombinations (String startTime, String endTime) {
LocalTime end = LocalTime.parse(endTime);
int count = 0;
for (LocalTime t = LocalTime.parse(startTime, DateTimeFormatter.ofPattern("HH:mm:ss")); t.isBefore(end); t=t.plusSeconds(1)) {
// System.out.println(t);
// String timeStr = t.toString();
// int second = t.get(ChronoField.SECOND_OF_MINUTE);
System.out.println(t);
Set<Integer> uniqueDigits = new TreeSet<Integer>();
String hour = String.valueOf(t.getHour());
String mins = String.valueOf(t.getMinute());
String secs = String.valueOf(t.getSecond());
uniqueDigits.add(Integer.valueOf(String.valueOf(t.getHour()).substring(0,1)));
if(hour.length()==2) {
uniqueDigits.add(Integer.valueOf(String.valueOf(t.getHour()).substring(1)));
}
uniqueDigits.add(Integer.valueOf(String.valueOf(t.getMinute()).substring(0,1)));
if(hour.length()==2) {
uniqueDigits.add(Integer.valueOf(String.valueOf(t.getMinute()).substring(1)));
}
uniqueDigits.add(Integer.valueOf(String.valueOf(t.getSecond()).substring(0,1)));
if(secs.length()==2) {
uniqueDigits.add(Integer.valueOf(String.valueOf(t.getSecond()).substring(0,1)));
}
我敢肯定,有更好的方法可以达到相同的结果。有人可以建议另一种方法吗?
谢谢
答案 0 :(得分:4)
也许我想念一些东西,但为什么不呢?
static void timeCombinations(String startTime, String endTime)
{
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime end = LocalTime.parse(endTime);
for(LocalTime t=LocalTime.parse(startTime); t.isBefore(end); t=t.plusSeconds(1))
{
System.out.println(dtf.format(t));
}
System.out.println(end);
}
测试:
public static void main(String[] args)
{
timeCombinations("12:09:59", "12:10:01");
}
输出:
12:09:59
12:10:00
12:10:01
答案 1 :(得分:2)
您可以使用LocalTime
。
LocalTime startLocalTime = LocalTime.parse(startTime);
LocalTime endLocalTime = LocalTime.parse(endTime);
while(startLocalTime.isBefore(endLocalTime)){
startLocalTime = startLocalTime.plusSeconds(1);
System.out.println(startLocalTime);
}
这将打印两个日期之间的所有可能值。 要了解更多信息,Read Time Api
只是一个选项,可以获取持续时间两次之间的可能时间计数。;
//duration calculates start and end date intervals.
Duration between = Duration.between(startLocalTime, endLocalTime);
//you can count how many seconds or minutes or hours.
//in your problem , getSeconds - 2 is your result between two time's possible
System.out.println(between.getSeconds());
在您的代码中,计算可能的日期计数。使用这样的负2。因为在此计算中应删除开始和结束日期。
要了解更多信息,请阅读Duration,Period Usage
答案 2 :(得分:2)
让我们先看看您采用的方法,即 String 方法。这绝对是可行的。它的代码如下。
public static void main(String [] args) {
String time1 = "12:09:47";
String time2 = "14:20:55";
List<String> times = getAllTimeValues(time1, time2);
}
public static ArrayList<String> getAllTimeValues(String time1, String time2) {
ArrayList<String> times = new ArrayList<String>();
times.add(time1);
while (!time1.equals(time2))
times.add(time1 = addOneSecond(time1));
return times;
}
public static String addOneSecond(String time) {
String[] HoursMinutesSeconds = time.split(":");
int hours = Integer.parseInt(HoursMinutesSeconds[0]);
int minutes = Integer.parseInt(HoursMinutesSeconds[1]);
int seconds = Integer.parseInt(HoursMinutesSeconds[2]);
if (seconds == 59) {
if (minutes == 59) {
hours++;
minutes = 0;
seconds = 0;
} else {
minutes++;
seconds = 0;
}
} else {
seconds++;
}
return String.format("%02d", hours) + ":" +
String.format("%02d", minutes) + ":" +
String.format("%02d", seconds);
}
还不错,这种方法用很短的代码就能完成工作。大部分工作都是使用addOneSecond方法完成的,该方法将检查秒数是否为60,然后分钟为60。
但是,有一种更简单的方法。在Java 8中,他们更改了日期和时间,并且非常易于使用。让我们看看另一种方法来完全执行上面的代码。
public static void main(String [] args) {
LocalTime time1 = LocalTime.of(12, 9, 47);
LocalTime time2 = LocalTime.of(14, 20, 55);
List<String> times = new ArrayList<String>();
while (time1.isBefore(time2)) {
times.add(time1.format(DateTimeFormatter.ISO_LOCAL_TIME).toString());
time1 = time1.plusSeconds(1);
}
}
这比第一个示例的代码少得多!同样,使用Java 8,您可以使用Date和Time类的这些静态成员。它使检查所有时间变得容易得多。