关键词:
【中文标题】Android使用时区检查打开和关闭时间之间是不是已经过去【英文标题】:Android check if between open and closing time has elapsed using timezoneAndroid使用时区检查打开和关闭时间之间是否已经过去 【发布时间】:2021-10-28 15:30:06 【问题描述】:如何在 android 中检查两次之间的时间? 我有开放时间和关闭时间,我想使用特定的国家时区检查关闭时间是否已经过去。
public void timeElapse(String start, String end, String tz)
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm aa", Locale.getDefault());
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm\\aa", Locale.getDefault());
try
sdf.setTimeZone(tzs);
Date currentTimeDate = sdf.parse(start);
Date endTimeDate = sdf.parse(end);
int a = currentTimeDate.compareTo(endTimeDate); // false / current time has not passed end time.
int b = endTimeDate.compareTo(currentTimeDate); // true / end time has passed current time.
Log.e("timeElapse", "("+end+") A = " + a + " B = " + b);
catch (ParseException ignored)
第二次尝试
public void timeElapse(String start, String end, String tz)
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm\\aa", Locale.getDefault());
try
TimeZone tzs = TimeZone.getTimeZone(tz);
sdf.setTimeZone(tzs);
long currentTimeDate = sdf.parse(start).getTime();
long endTimeDate = sdf.parse(end).getTime();
if(currentTimeDate>endTimeDate)
Log.e("timeElapse", "Time has passed");
else
Log.e("timeElapse", "You are on time");
catch (ParseException ignored)
用法
timeElapse("10:00AM", "10:00PM", "Asia/Kuala_Lumpur");
timeElapse("10:00AM", "12:00PM", "Asia/Kuala_Lumpur");
timeElapse("11:30AM", "05:00PM", "Asia/Kuala_Lumpur");
timeElapse("10:00AM", "01:00AM", "Asia/Kuala_Lumpur");
我的代码不起作用。我收到错误 java.text.ParseException: Unparseable date: "10:00AM"
【问题讨论】:
一般情况下,您将时间保存在单个时区(通常为 UTC)中,并将当前时区转换为 UTC 以进行比较。将所有数据保存在一个时区中可以使代码更易于理解,并减少将来出现问题的可能性。 @GabeSechan 你能举个例子吗? 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat
和朋友。看看您是否可以使用desugaring 或将ThreeTenABP 添加到您的Android 项目中,以便使用现代Java 日期和时间API 的java.time。使用起来感觉好多了。
您的尝试是否按预期工作?如果您得到任何意想不到的结果,请为我们说明。
@OleV.V.我的代码不起作用我收到错误java.text.ParseException: Unparseable date: "10:00AM"
【参考方案1】:
java.time 脱糖
考虑使用现代 Java 日期和时间 API java.time 来处理您的时间工作。
在仔细阅读问题后对代码进行了编辑。
private static final DateTimeFormatter TIME_PARSER
= DateTimeFormatter.ofPattern("hh:mma", Locale.ENGLISH);
public static void timeElapse(String start, String end)
LocalTime currentTime = LocalTime.parse(start, TIME_PARSER);
LocalTime endTime = LocalTime.parse(end, TIME_PARSER);
if (currentTime.isAfter(endTime))
System.out.println("Time has passed");
else
System.out.println("You are on time");
代码不是很容易解释吗?这是我觉得 java.time 不错的一件事。并且在 cmets 中已经暗示,我们不需要时区(极端情况除外)。所以我省略了第三个参数。让我们用你的例子来试试吧:
timeElapse("10:00AM", "10:00PM");
timeElapse("10:00AM", "12:00PM");
timeElapse("11:30AM", "05:00PM");
timeElapse("10:00AM", "01:00AM");
输出是:
You are on time You are on time You are on time Time has passed
时区不重要吗?如果您的时间落入回退中,时钟倒转并且相同的时钟小时重复,我们将无法判断哪个更早。我上面的代码没有考虑这种极端情况,为此,我们也需要知道日期。
原码
private static final DateTimeFormatter TIME_PARSER
= DateTimeFormatter.ofPattern("hh:mma", Locale.ENGLISH);
public static void timeElapse(String start, String end, String tz)
LocalTime startTime = LocalTime.parse(start, TIME_PARSER);
LocalTime endTime = LocalTime.parse(end, TIME_PARSER);
LocalTime now = LocalTime.now(ZoneId.of(tz));
if (now.isBefore(startTime))
System.out.println("Not open yet");
else if (now.isAfter(endTime))
System.out.println("Time has passed");
else
System.out.println("You are on time");
代码不是很容易解释吗?这是我觉得 java.time 不错的一件事。让我们用你的例子来试试吧:
timeElapse("10:00AM", "10:00PM", "Asia/Kuala_Lumpur");
timeElapse("10:00AM", "12:00PM", "Asia/Kuala_Lumpur");
timeElapse("11:30AM", "05:00PM", "Asia/Kuala_Lumpur");
timeElapse("10:00AM", "01:00AM", "Asia/Kuala_Lumpur");
我在马来西亚凌晨 2 点 15 分左右运行了这段代码,所以正如预期的那样,输出有点枯燥:
Not open yet Not open yet Not open yet Not open yet
我们也试试:
timeElapse("12:00AM", "03:00AM", "Asia/Kuala_Lumpur");
timeElapse("01:00AM", "02:00AM", "Asia/Kuala_Lumpur");
You are on time Time has passed
问题:java.time 不需要 Android API 26 级吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6。
在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从org.threeten.bp
导入日期和时间类以及子包。
你的代码出了什么问题?
您在格式模式字符串中的分钟和 AM/PM 标记之间有一个反斜杠:"hh:mm\\aa"
。这需要在您的时间字符串中使用反斜杠,但它们就像"10:00AM"
,即没有任何反斜杠。我相信这导致了您的ParseException
。为格式化程序指定 Locale.getDefault()
也可能存在问题。 AM 和 PM 在英语以外的其他语言中几乎不使用,但在某些语言中确实有其他名称(文本)。您要求文本使用 JVM(和您的设备)的默认语言。
另外请注意,如果您想将解析的时间与现在的时间进行比较,使用 java.time 很容易。它不适用于Date
和SimpleDateFormat
。 SimpleDateFormat
将每个字符串解析为 1970 年 1 月 1 日的指定时间,因此与现在的时间比较没有意义。
链接
Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了java.time
。
ThreeTen Backport project,java.time
的向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。
Java 8+ APIs available through desugaring
ThreeTenABP,Android 版 ThreeTen Backport
Question: How to use ThreeTenABP in Android Project,解释得很透彻。
【讨论】:
这很好,但有一点我注意到timeElapse("10:00AM", "05:00AM", "Asia/Kuala_Lumpur")
,当在10AM
附近打开并在5AM
附近关闭时,它总是显示未打开。有什么办法可以查到关门时间是不是隔天?
@Peter 只是有点复杂。参见例如Check if a given time lies between two times regardless of date。如果您需要更多,请搜索更多。如何检查android中其他设备的蓝牙是不是打开/关闭?
】如何检查android中其他设备的蓝牙是不是打开/关闭?【英文标题】:HowtocheckthebluetoothisON/OFFofotherdevicesinandroid?如何检查android中其他设备的蓝牙是否打开/关闭?【发布时间】:2012-02-0314:01:10【问题描述】:我正在开发一个android... 查看详情
android如何修改时区
参考技术A 1、打开手机设置里的更多的设置选项,然后点击点击日期和时间的选项; 2、把自动确定日期时间关闭,关闭后方可进行设置时间日期; 3、关闭后会出现年份月份日份列表,手指依次在上面滑动即可进行... 查看详情
安卓手机怎样更新时间?
首先检查手机网络数据是否为正常连接使用中,只有连接到网络才能同步时间接着打开手机的——》【设置】菜单,找到——》【日期和时间】 3.查看是否已经关闭自动更新,在日期和时间面页上点击——》【自动确定日期... 查看详情
Android棒棒糖工具栏在打开/关闭抽屉和后退按钮之间切换
】Android棒棒糖工具栏在打开/关闭抽屉和后退按钮之间切换【英文标题】:Androidlollipoptoolbarswitchbetweenopen/closedrawerandbackbutton【发布时间】:2014-12-2713:56:49【问题描述】:我有标准的导航抽屉,但现在我正在尝试使用工具栏对其进... 查看详情
如何在关闭之前检查mysqli连接是不是打开
】如何在关闭之前检查mysqli连接是不是打开【英文标题】:HowtoCheckWhethermysqliconnectionisopenbeforeclosingit如何在关闭之前检查mysqli连接是否打开【发布时间】:2013-04-2512:27:48【问题描述】:我将使用mysqli_close($connection)关闭$connection。... 查看详情
JavaScript 检查时区名称是不是有效
】JavaScript检查时区名称是不是有效【英文标题】:JavaScriptcheckiftimezonenamevalidornotJavaScript检查时区名称是否有效【发布时间】:2017-10-2206:39:41【问题描述】:有没有办法在不使用外部库的情况下检查时区名称在JavaScript中是否有效... 查看详情
检查打开的窗口是不是已关闭
】检查打开的窗口是不是已关闭【英文标题】:Checkifopenedwindowhasbeenclosed检查打开的窗口是否已关闭【发布时间】:2012-08-2409:28:52【问题描述】:我有一个主窗口,即应用程序启动窗口。在该窗口中,有一个绑定到SQLDatabase的Repea... 查看详情
如何检查设备是不是有闪光灯 LED android
】如何检查设备是不是有闪光灯LEDandroid【英文标题】:howtocheckifdevicehasflashlightledandroid如何检查设备是否有闪光灯LEDandroid【发布时间】:2012-11-0500:31:32【问题描述】:如何检查设备是否有摄像头LED(手电筒)。我说的是安卓操... 查看详情
检查端口是不是在 Android/Java 上打开
】检查端口是不是在Android/Java上打开【英文标题】:CheckifPortisopenonAndroid/Java检查端口是否在Android/Java上打开【发布时间】:2013-08-1912:15:06【问题描述】:我想检查一个端口是否打开,或者是否有服务器在其上运行。我已经尝试... 查看详情
如何检查到 UNIX 时间戳之间是不是有时间变化
】如何检查到UNIX时间戳之间是不是有时间变化【英文标题】:HowtocheckiftherehasbeenatimechangebetweentoUNIXtimestamps如何检查到UNIX时间戳之间是否有时间变化【发布时间】:2021-06-1222:30:42【问题描述】:所以在我的本地时区(东部标准时... 查看详情
检查时区的日期是不是超过当前时间
】检查时区的日期是不是超过当前时间【英文标题】:Checkifthedateofatimezoneispassedcurrenttime检查时区的日期是否超过当前时间【发布时间】:2015-12-2307:16:04【问题描述】:我收到格式为12:00的时间,并且我还有一个格式为<DstTzI... 查看详情
如何让客户实际时间和时区执行系统时间检查
】如何让客户实际时间和时区执行系统时间检查【英文标题】:howtogetclientsactualtimeandtimezonetoperformsystemtimecheck【发布时间】:2017-07-1116:28:30【问题描述】:这可能是一个非常模糊的问题,但请多多包涵。我正在开发一个需要我在... 查看详情
检查弹出窗口是不是关闭
】检查弹出窗口是不是关闭【英文标题】:Checkifapopupwindowisclosed检查弹出窗口是否关闭【发布时间】:2011-09-1000:43:54【问题描述】:我正在用打开一个弹出窗口varpopup=window.open(\'...\',\'...\');此javascript是在控件中定义的。然后从网... 查看详情
检查服务器端口是不是从 Android 打开
】检查服务器端口是不是从Android打开【英文标题】:CheckingifserverportisopenfromAndroid检查服务器端口是否从Android打开【发布时间】:2011-12-2715:56:27【问题描述】:我正在尝试从我的Android设备连接到我的远程服务器。如何检查服务... 查看详情
如何使用当前时间计算某个位置的打开和关闭时间
】如何使用当前时间计算某个位置的打开和关闭时间【英文标题】:HowcanIcalculatesomelocationOpenandCloseTimewithCurrentTime【发布时间】:2015-12-1722:13:50【问题描述】:我想要一个餐厅应用程序,并且我想改进我的功能。我有NSDate格式的... 查看详情
Python:检查解析的日期时间是不是具有正确的时区
】Python:检查解析的日期时间是不是具有正确的时区【英文标题】:Python:CheckifparseddatetimehascorrecttimezonePython:检查解析的日期时间是否具有正确的时区【发布时间】:2020-07-0302:12:43【问题描述】:所以,我知道ISO格式的日期时... 查看详情
如何检查元素是不是具有AngularJS的类?
】如何检查元素是不是具有AngularJS的类?【英文标题】:HowtocheckifelementhasclasswithAngularJS?如何检查元素是否具有AngularJS的类?【发布时间】:2014-02-0704:26:43【问题描述】:我有一个在网站上完美运行的面板外菜单。用户可以使用... 查看详情
如何检查引导模式是不是打开,以便我可以使用 jquery 验证?
】如何检查引导模式是不是打开,以便我可以使用jquery验证?【英文标题】:Howtocheckifbootstrapmodalisopen,soIcanusejqueryvalidate?如何检查引导模式是否打开,以便我可以使用jquery验证?【发布时间】:2013-10-3015:53:55【问题描述】:仅当... 查看详情