字符串之间的时间差



我正在做一个编码挑战,目标是在字符串列表中找到最小的时差。我放弃了,并寻找了一个完全有意义的解决方案,但我对方法parseTime感到困惑。任何人都可以解释一下这种方法吗?

在我看来,比较的两个小时被减去,然后乘以 60(因为一小时 60 分钟? 从那比较分钟,然后我迷路了..谁能解释得尽可能简单?

public static void main(String[] args) {
String[] strings = {"10:00am", "11:45pm", "5:00am", "12:01am"};
int i = TimeDifference(strings);
System.out.println(i);
}
public static int TimeDifference(String[] strArr) {
int min = Integer.MAX_VALUE;
for (int i=0; i<strArr.length; i++) {
for (int j=0; j<strArr.length; j++) {
if (i != j) {
int time = parseTime(strArr[j], strArr[i]);
if (time < min) min = time;
}
}
}
return min;
}
private static int parseTime(String time1, String time2) {
int time = (parseHour(time2) - parseHour(time1))*60;
time += parseMin(time2) - parseMin(time1);
if (isMorning(time2) != isMorning(time1)) {
time += 12 *60;
} else if (time <= 0 ) {
time += 24 * 60;
}
return time;
}
private static int parseHour(String time) {
int hour = Integer.valueOf(time.split(":")[0]);
return ( hour == 12? 0: hour);
}
private static int parseMin(String time) {
return Integer.valueOf(time.split(":")[1].replaceAll("[^0-9]",""));
}
private static boolean isMorning(String time) {
String post = time.split(":")[1].replaceAll("[^a-z]","");
return post.toLowerCase().equals("am");
}

尝试在脑海中调试代码。请在下面查看我的评论:

int minutes = parseTime("10:00am", "11:45pm");
private static int parseTime(String time1, String time2) {
int minutes = (parseHour(time2) - parseHour(time1))*60;//(11 - 10) * 60 = 60 minutes
minutes += parseMin(time2) - parseMin(time1); //60 + 45 - 0 = 105 minutes
if (isMorning(time2) != isMorning(time1)) { // 10:00am is not morning but 11:45pm is morning
minutes += 12 *60; //so we have to add 12 hours(12 * 60 minutes)
} else if (minutes <= 0 ) {
minutes += 24 * 60;
}

return minutes;
}

这是关于正则表达式(RegEx)的。我们以11:45pm为例,分手parseTime

int time = (parseHour(time2) - parseHour(time1))*60;

第一行使用parseHour,它利用split将字符串拆分为给定正则表达式的匹配项,":",然后将索引 0 处的字符串解析为整数。 字符串"11:45pm"被拆分为字符串数组{"11", "45pm"},并返回整数11

time += parseMin(time2) - parseMin(time1);

第二行使用parseMin,它同样拆分给定的字符串,但解析索引 1 处的字符串。但是,字符串"45pm"不能解析为整数,因为它包含非数字"pm",因此我们使用replaceAll将任何非数字替换为空字符串。replaceAll将匹配给定正则表达式的此字符串的每个子字符串替换为给定替换。"[^0-9]"匹配0-9中不存在的任何单个字符,这些字符都是非数字,因此"45pm".replaceAll("[^0-9]", "")返回"45",然后被解析为整数。

其余的已经由其他人回答了。

是的,小时差乘以60转换为分钟。然后使用parseMin将分钟差添加到其中。

现在我们需要它 检查它是AM还是PM.示例:如果时间是10:30 am1:35 pm。实际时差为+115分钟。

parseHour后,time的值将为-600((1-10)*60。然后在parseMin之后,time将被-595(增加5分钟的差)。现在我们需要看看它是AM还是PM.由于time1AMtime2PM的,我们添加12hrs的差异。这是因为AMPM的相同时间相差 12 小时。 在此之后,time将是(-605 + 720) = 115分钟。

time<=0.这是time2time1之前的时候。示例time110:35amtime210:30am。所以问题是 -10:35am到达10:30am需要多少时间.由于它是10:35am,而且我们无法及时返回,我们需要等到第二天(24小时)才能到达10:30am。所以我们在time中添加24*60 minutes,这将得到-5 + (24*60)

最新更新