android - 然后比较不同时间并显示错误消息android
问题描述
我花了 1 天的时间来比较两次,但直到现在还没有值得的结果。我基本上是在尝试比较两个不同的时间,我想避免第一次存储数据 id 少于第二次,但我不能。另外,相等的部分工作顺利,但第二部分不工作
@Override
public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute) throws ParseException {
String AM_PM = " AM";
String pattern = "HH:mm";
SimpleDateFormat format = new SimpleDateFormat(pattern);
String mm_precede = "";
if (hourOfDay >= 12) {
AM_PM = " PM";
if (hourOfDay >=13 && hourOfDay < 24) {
hourOfDay -= 12;
}
else {
hourOfDay = 12;
}
} else if (hourOfDay == 0) {
hourOfDay = 12;
}
if (minute < 10) {
mm_precede = "0";
}
if (id == 1 && id ==2) {
Date date1 = format.parse(sTimeApp.getText().toString());
Date date2 = format.parse(eTimeApp.getText().toString());
DateTime da1 = new DateTime(date1);
DateTime da2 = new DateTime(date2);
System.out.println("Date" + date1);
System.out.println("Date" + date1);
if (da1.equals(da2) ){
Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
return;
}else if (da1.isBefore(da2)){
Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
return;
}
}
// if (sTimeApp.equals(eTimeApp) ) {
// Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
// return;
// }
if (id == 1) {
if (minute <= 9) {
sTimeApp.setText(hourOfDay + ":" + mm_precede + minute + AM_PM);
} else {
sTimeApp.setText(hourOfDay + ":" + mm_precede + minute + AM_PM);
}
} else if (id == 2) {
if (minute <= 9) {
eTimeApp.setText(hourOfDay + ":" + mm_precede + minute + AM_PM);
} else {
eTimeApp.setText(hourOfDay + ":" + mm_precede + minute + AM_PM);
}
}
}
}
解决方案
java.time
我想你在追求这样的事情:
static DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
@Override
public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute) {
if (id == 1 || id == 2) {
LocalTime start = LocalTime.parse(sTimeApp.getText(), timeFormatter);
LocalTime end = LocalTime.parse(eTimeApp.getText(), timeFormatter);
if (start.equals(end)) {
Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
return;
} else if (end.isBefore(start)) {
Toast.makeText(this, "Error , Time should not be before ", Toast.LENGTH_SHORT).show();
return;
}
LocalTime newTime = LocalTime.of(hourOfDay, minute);
String formattedTime = newTime.format(timeFormatter);
if (id == 1) {
sTimeApp.setText(formattedTime);
} else {
assert id == 2 : id;
eTimeApp.setText(formattedTime);
}
}
}
如果您已经在使用 Joda-Time,您可能现在不想升级到 java.time。Joda-Time 也有一个LocalTime
类,你可以像我org.threeten.bp.LocalTime
在上面使用的一样使用它。
我不确定您是否还想将通过时间选择器设置的时间与已经在sTimeApp
或中的开始时间或结束时间进行比较eTimeApp
。我没有介绍过这样的比较。
你的代码出了什么问题?
id == 1 && id ==2
不可能是真的。在我的代码中,我提出了建议id == 1 || id == 2
,但请检查你想要什么。- 我怀疑你比较错误的方式。当我阅读您的代码时,如果开始时间在结束时间之前,您会发出一条错误消息,我认为这是正常和正确的情况。在我的代码中,如果结束时间在开始时间之前,我会发出一条错误消息。
- 您似乎正在手动格式化显示时间。这是过于复杂的方式。相反,我使用 a
DateTimeFormatter
来格式化时间(同样,Joda-Time 具有类似的功能)。 - 您正在使用过时的
SimpleDateFormat
和Date
类。相反,我建议您使用 java.time,这是现代 Java 日期和时间 API。如果您已经在使用 Joda-Time,那也是一个不错的选择。在这两种情况下,完全避免提到过时的类,因为 Joda-Time 或 java.time 提供了您需要的所有功能。
问题:我可以在 Android 上使用 java.time 吗?
是的,java.time
在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,现代 API 是内置的。
- 在 Java 6 和 7 中获得 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从
org.threeten.bp
子包中导入日期和时间类。
链接
- Oracle 教程:日期时间解释如何使用
java.time
. - Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - ThreeTenABP , ThreeTen Backport 的 Android 版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
- Joda-Time
LocalTime
文档
推荐阅读
- reactjs - 反应按钮 onClick 需要两次单击才能第二次工作
- r - 如何解决这个聚类分析?
- css - 使用反应引导时如何对齐列左侧的项目?
- hibernate - Spring数据批量saveAll处理异常
- gradle - Gradle:解决工件名称与模块名称不同的依赖关系
- python - 与 tensorflow 使用 google flatbuffers 和 tflite 模式提供的 tflite 转换器相比,我们如何编写自己的自定义 tflite 编写器
- c# - ServiceProvider.GetService 为瞬态实例工厂中的范围服务返回相同的实例
- c# - 将值添加到类 c# 中的列表
- python - 在 MongoDB 中搜索文档时如何使用两个字段的总和?
- java - 我收到一个错误,运算符 + 未定义参数类型 int[] int