选择时比较时间不正确 12:00
Comparing time is incorrect when picking 12:00
我正在创建一个预订系统,我不想让用户预订开始时间 11:00 和结束时间 09:00(过去)(我使用的是 24 小时制)。
我有两个组合框,其中填充了用作开始和结束时间的字符串 (09:00、10:00、11:00、12:00、13:00....)
我有这个代码:
String start = (String) startTime.getSelectedItem();
String end = (String) endTime.getSelectedItem();
try {
if(new SimpleDateFormat("hh:mm").parse(start).before(new SimpleDateFormat("hh:mm").parse(end))){
System.out.println("test1");// future date - good
}else{
System.out.println("fail2");// old date - bad
}
} catch (ParseException ex) {
System.out.println("error");
}
除了我选择 start/end 时间为 12:00 之外,这非常有效。程序输出与它应该输出的相反,我不确定为什么。
如果我选择开始时间 14:00 和结束时间 12:00 程序将输出 fail2(良好输出),
如果我选择开始时间 09:00 和结束时间 12:00 程序将输出 fail2(应该是 test1),
如果我选择开始时间 12:00 和结束时间 10:00 程序将输出 test1(应该是 fail2),
如果我选择开始时间 12:00 和结束时间 15:00 程序将输出 test1(良好输出)
只有选择12:00时才会出现这种问题..
你应该使用 HH:mm
.
hh
范围 01-12
,而 HH
范围 1-23
.
更新
勾选SimpleDateFormat
的doc:
H: Hour in day (0-23)
h: Hour in am/pm (1-12)
String start = (String) startTime.getSelectedItem();
String end = (String) endTime.getSelectedItem();
SimpleDateFormat timer = new SimpleDateFormat("HH:mm");
try {
Date startD = timer.parse(start);
Date endD = timer.parse(end);
if(startD.before(endD)){
System.out.println("test1");// future date - good
}else{
System.out.println("fail2");// old date - bad
}
} catch (ParseException ex) {
System.out.println("error");
}
将我的代码更改为此解决了这个问题..
public static void checkTimes(String start, String end) {
try {
if (LocalTime.parse(start).isBefore(LocalTime.parse(end))) {
System.out.println("test1");// future date - good
} else {
System.out.println("fail2");// old date - bad
}
} catch (DateTimeParseException dtpe) {
System.out.println("error");
}
}
我们来试试吧:
checkTimes("14:00", "12:00");
checkTimes("09:00", "12:00");
checkTimes("12:00", "10:00");
checkTimes("12:00", "15:00");
这会打印:
fail2
test1
fail2
test1
我相信这与您的意图一致。请注意 LocalTime
无需显式格式化程序即可解析您的字符串。此外,如果您相信您的组合框只包含有效的时间字符串,您可以省略 try
-catch
结构,因为 DateTimeParseException
是一个未经检查的异常。
如果startTime
和endTime
是JComboBox
,我相信你甚至可以将LocalTime
对象填入其中。那么当用户 select 时,你不需要解析每个。您的 JComboBox
将调用 LocalTime.toString()
,这将 return 一个类似于 09:00
的字符串,组合框将依次显示并让用户 select.
LocalTime[] times = { LocalTime.of(9, 0), LocalTime.of(10, 0), LocalTime.of(11, 0),
LocalTime.of(12, 0), LocalTime.of(13, 0), LocalTime.of(14, 0) };
JComboBox<LocalTime> combo = new JComboBox<>(times);
展开:
我正在使用 java.time
中的 LocalTime
,现代 Java 日期和时间 API。 java.time
通常比 SimpleDateFormat
、Date
等旧的和过时的日期和时间 类 更好用。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
我正在创建一个预订系统,我不想让用户预订开始时间 11:00 和结束时间 09:00(过去)(我使用的是 24 小时制)。 我有两个组合框,其中填充了用作开始和结束时间的字符串 (09:00、10:00、11:00、12:00、13:00....)
我有这个代码:
String start = (String) startTime.getSelectedItem();
String end = (String) endTime.getSelectedItem();
try {
if(new SimpleDateFormat("hh:mm").parse(start).before(new SimpleDateFormat("hh:mm").parse(end))){
System.out.println("test1");// future date - good
}else{
System.out.println("fail2");// old date - bad
}
} catch (ParseException ex) {
System.out.println("error");
}
除了我选择 start/end 时间为 12:00 之外,这非常有效。程序输出与它应该输出的相反,我不确定为什么。
如果我选择开始时间 14:00 和结束时间 12:00 程序将输出 fail2(良好输出),
如果我选择开始时间 09:00 和结束时间 12:00 程序将输出 fail2(应该是 test1),
如果我选择开始时间 12:00 和结束时间 10:00 程序将输出 test1(应该是 fail2),
如果我选择开始时间 12:00 和结束时间 15:00 程序将输出 test1(良好输出)
只有选择12:00时才会出现这种问题..
你应该使用 HH:mm
.
hh
范围 01-12
,而 HH
范围 1-23
.
更新
勾选SimpleDateFormat
的doc:
H: Hour in day (0-23)
h: Hour in am/pm (1-12)
String start = (String) startTime.getSelectedItem();
String end = (String) endTime.getSelectedItem();
SimpleDateFormat timer = new SimpleDateFormat("HH:mm");
try {
Date startD = timer.parse(start);
Date endD = timer.parse(end);
if(startD.before(endD)){
System.out.println("test1");// future date - good
}else{
System.out.println("fail2");// old date - bad
}
} catch (ParseException ex) {
System.out.println("error");
}
将我的代码更改为此解决了这个问题..
public static void checkTimes(String start, String end) {
try {
if (LocalTime.parse(start).isBefore(LocalTime.parse(end))) {
System.out.println("test1");// future date - good
} else {
System.out.println("fail2");// old date - bad
}
} catch (DateTimeParseException dtpe) {
System.out.println("error");
}
}
我们来试试吧:
checkTimes("14:00", "12:00");
checkTimes("09:00", "12:00");
checkTimes("12:00", "10:00");
checkTimes("12:00", "15:00");
这会打印:
fail2
test1
fail2
test1
我相信这与您的意图一致。请注意 LocalTime
无需显式格式化程序即可解析您的字符串。此外,如果您相信您的组合框只包含有效的时间字符串,您可以省略 try
-catch
结构,因为 DateTimeParseException
是一个未经检查的异常。
如果startTime
和endTime
是JComboBox
,我相信你甚至可以将LocalTime
对象填入其中。那么当用户 select 时,你不需要解析每个。您的 JComboBox
将调用 LocalTime.toString()
,这将 return 一个类似于 09:00
的字符串,组合框将依次显示并让用户 select.
LocalTime[] times = { LocalTime.of(9, 0), LocalTime.of(10, 0), LocalTime.of(11, 0),
LocalTime.of(12, 0), LocalTime.of(13, 0), LocalTime.of(14, 0) };
JComboBox<LocalTime> combo = new JComboBox<>(times);
展开:
我正在使用 java.time
中的 LocalTime
,现代 Java 日期和时间 API。 java.time
通常比 SimpleDateFormat
、Date
等旧的和过时的日期和时间 类 更好用。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.