时差 AM/PM 与 Java
Time difference in AM/PM in Java
我正在尝试通过输入时间格式在 12 小时内计算 java 的时差,当我输入开始时间 11:58:10 pm
和结束时间 12:02:15 am
时效果很好。但是当我输入 12:00:00 am 和 12:00:00 pm 时,它给出了 0 分钟的差异。不知道为什么。以下是我的代码,请让我知道我哪里错了。
Scanner input = new Scanner(System.in);
System.out.print("Enter start time (HH:mm:ss aa): ");
String starttime = input.nextLine();
System.out.print("Enter end time (HH:mm:ss aa): ");
String endtime = input.nextLine();
//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss aa");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(starttime);
d2 = format.parse(endtime);
//in milliseconds
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
System.out.print(diffMinutes + " minutes and "+diffSeconds + " seconds.");
} catch (Exception e) {
System.out.println("Invalid fromat");
}
新的 java.time
方法 LocalTime
、DateTimeFormatter
和 Duration
提供了更好的方法来处理这个问题。例如:
DateTimeFormatter format = DateTimeFormatter.ofPattern("h:m:s a");
LocalTime time1 = LocalTime.parse("12:00:00 am", format);
LocalTime time2 = LocalTime.parse("2:00:20 pm", format);
Duration dur = Duration.between(time1, time2);
System.out.println(dur.toMinutes() + " minutes " + dur.toSecondsPart() + " seconds");
注意:Duration.toSecondsPart
需要 Java 9 或更高版本,此代码的其余部分需要 Java 8 或更高版本。
问题出在以下行:
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss aa");
应该是:
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
符号H
用于24小时格式的时间,而h
用于12格式的时间-小时格式。
你计算的diffMinutes
也是错误的
按如下操作:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter start time (hh:mm:ss aa): ");
String starttime = input.nextLine();
System.out.print("Enter end time (hh:mm:ss aa): ");
String endtime = input.nextLine();
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(starttime);
d2 = format.parse(endtime);
// in milliseconds
long diff = Math.abs(d2.getTime() - d1.getTime());
long diffSeconds = (diff / 1000) % 60;
long diffMinutes = (diff / (60 * 1000));
System.out.print(diffMinutes + " minutes and " + diffSeconds + " seconds.");
} catch (Exception e) {
System.out.println("Invalid fromat");
}
}
}
样本运行:
Enter start time (hh:mm:ss aa): 10:20:30 am
Enter end time (hh:mm:ss aa): 10:20:13 pm
719 minutes and 43 seconds.
备注:
- 如@greg-449 所述,您应该努力使用 modern date-time API。
- 两个数量之间的差值是一个绝对值,它始终为正,即 2 和 5 之间的差值 = 5 和 2 之间的差值 = 3。
Math.abs
给出最适合的数字的绝对值用于找出两个数量之间的差异。
- 您需要了解,在不说明日期的情况下,两次之间的差异始终被视为同一日期,即 12:02:15 am 和 11:58:10 pm 之间的差异 = [= 之间的差异60=] pm 和 12:02:15 am = 1435 分 55 秒。一个日期的 11:58:10 pm 和下一个日期的 12:02:15 am 之间的差异是 4 分 5 秒。但是,您的输入仅适用于时间,没有日期元素,因此已考虑同一日期的差异。下面给出的是考虑时间日期的程序。
考虑日期和时间的程序:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter start time (dd.MM.yyyy at hh:mm:ss aa): ");
String starttime = input.nextLine();
System.out.print("Enter end time (dd.MM.yyyy at hh:mm:ss aa): ");
String endtime = input.nextLine();
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy 'at' hh:mm:ss aa");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(starttime);
d2 = format.parse(endtime);
// in milliseconds
long diff = Math.abs(d2.getTime() - d1.getTime());
long diffSeconds = (diff / 1000) % 60;
long diffMinutes = (diff / (60 * 1000));
System.out.print(diffMinutes + " minutes and " + diffSeconds + " seconds.");
} catch (Exception e) {
System.out.println("Invalid fromat");
}
}
}
样本运行:
Enter start time (dd.MM.yyyy at hh:mm:ss aa): 03.03.2020 at 11:58:10 pm
Enter end time (dd.MM.yyyy at hh:mm:ss aa): 04.03.2020 at 12:02:15 am
4 minutes and 5 seconds.
我正在尝试通过输入时间格式在 12 小时内计算 java 的时差,当我输入开始时间 11:58:10 pm
和结束时间 12:02:15 am
时效果很好。但是当我输入 12:00:00 am 和 12:00:00 pm 时,它给出了 0 分钟的差异。不知道为什么。以下是我的代码,请让我知道我哪里错了。
Scanner input = new Scanner(System.in);
System.out.print("Enter start time (HH:mm:ss aa): ");
String starttime = input.nextLine();
System.out.print("Enter end time (HH:mm:ss aa): ");
String endtime = input.nextLine();
//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss aa");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(starttime);
d2 = format.parse(endtime);
//in milliseconds
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
System.out.print(diffMinutes + " minutes and "+diffSeconds + " seconds.");
} catch (Exception e) {
System.out.println("Invalid fromat");
}
新的 java.time
方法 LocalTime
、DateTimeFormatter
和 Duration
提供了更好的方法来处理这个问题。例如:
DateTimeFormatter format = DateTimeFormatter.ofPattern("h:m:s a");
LocalTime time1 = LocalTime.parse("12:00:00 am", format);
LocalTime time2 = LocalTime.parse("2:00:20 pm", format);
Duration dur = Duration.between(time1, time2);
System.out.println(dur.toMinutes() + " minutes " + dur.toSecondsPart() + " seconds");
注意:Duration.toSecondsPart
需要 Java 9 或更高版本,此代码的其余部分需要 Java 8 或更高版本。
问题出在以下行:
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss aa");
应该是:
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
符号H
用于24小时格式的时间,而h
用于12格式的时间-小时格式。
你计算的diffMinutes
也是错误的
按如下操作:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter start time (hh:mm:ss aa): ");
String starttime = input.nextLine();
System.out.print("Enter end time (hh:mm:ss aa): ");
String endtime = input.nextLine();
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(starttime);
d2 = format.parse(endtime);
// in milliseconds
long diff = Math.abs(d2.getTime() - d1.getTime());
long diffSeconds = (diff / 1000) % 60;
long diffMinutes = (diff / (60 * 1000));
System.out.print(diffMinutes + " minutes and " + diffSeconds + " seconds.");
} catch (Exception e) {
System.out.println("Invalid fromat");
}
}
}
样本运行:
Enter start time (hh:mm:ss aa): 10:20:30 am
Enter end time (hh:mm:ss aa): 10:20:13 pm
719 minutes and 43 seconds.
备注:
- 如@greg-449 所述,您应该努力使用 modern date-time API。
- 两个数量之间的差值是一个绝对值,它始终为正,即 2 和 5 之间的差值 = 5 和 2 之间的差值 = 3。
Math.abs
给出最适合的数字的绝对值用于找出两个数量之间的差异。 - 您需要了解,在不说明日期的情况下,两次之间的差异始终被视为同一日期,即 12:02:15 am 和 11:58:10 pm 之间的差异 = [= 之间的差异60=] pm 和 12:02:15 am = 1435 分 55 秒。一个日期的 11:58:10 pm 和下一个日期的 12:02:15 am 之间的差异是 4 分 5 秒。但是,您的输入仅适用于时间,没有日期元素,因此已考虑同一日期的差异。下面给出的是考虑时间日期的程序。
考虑日期和时间的程序:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter start time (dd.MM.yyyy at hh:mm:ss aa): ");
String starttime = input.nextLine();
System.out.print("Enter end time (dd.MM.yyyy at hh:mm:ss aa): ");
String endtime = input.nextLine();
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy 'at' hh:mm:ss aa");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(starttime);
d2 = format.parse(endtime);
// in milliseconds
long diff = Math.abs(d2.getTime() - d1.getTime());
long diffSeconds = (diff / 1000) % 60;
long diffMinutes = (diff / (60 * 1000));
System.out.print(diffMinutes + " minutes and " + diffSeconds + " seconds.");
} catch (Exception e) {
System.out.println("Invalid fromat");
}
}
}
样本运行:
Enter start time (dd.MM.yyyy at hh:mm:ss aa): 03.03.2020 at 11:58:10 pm
Enter end time (dd.MM.yyyy at hh:mm:ss aa): 04.03.2020 at 12:02:15 am
4 minutes and 5 seconds.