在我的应用程序中,每当用户使用它输入数据时,我都需要获取当前的日期和时间。
我知道我可以使用System.currentTimeMillis(),但它可以给我错误的时间(因为它给了系统时间,可以由用户编辑) 所以我看到唯一的方法是在用户进行数据输入时调用服务器当前时间。但我不确定互联网连接总是可以使用。
在没有使用互联网连接的情况下,有没有办法在Android中获取当前时间(非系统时间)?
答案 0 :(得分:1)
如果您不想要系统时间,那么您需要一些其他来源。 我知道有几种可能性:
我相信所有这些都不是很有帮助。我不认为你可以找到一种获取当前时间的方法,而无需在外部连接。 在我看来,你应该使用系统时间并假设它设置正确。如果不是您的应用程序不应该崩溃,并且应该因为错误的日期而轻轻地告知用户他的内容错误...
答案 1 :(得分:0)
我相信没有时区就无法获得当前的系统时间。
一个好方法是将当前系统时间放在第一位
long time= System.currentTimeMillis();
然后获得正确的TimeZone来处理它
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
答案 2 :(得分:0)
long dateInMillis = System.currentTimeMillis();
String format = "yyyy-MM-dd HH:mm:ss";
final SimpleDateFormat sdf = new SimpleDateFormat(format);
String dateString = sdf.format(new Date(dateInMillis));
使用dateString
作为您的变量,其中包含当前日期时间作为时间戳。
答案 3 :(得分:0)
好吧,我搜索了你的主题,我得到了逻辑解决方案但没有经过测试:
“使用网络提供的值”,在Android手机设置中,它如下图所示:
我显示的屏幕是 DateTimeSettings 。 “使用网络提供的值”复选框与共享首选项字符串 KEY_AUTO_TIME =“ auto_time ”相关联;以及 Settings.System.AUTO_TIME
此设置由2个网络ServiceStateTrackers中观察到的名为 mAutoTimeObserver 的观察: GsmServiceStateTracker 和 CdmaServiceStateTracker 。
当设置变为true时,两个实现都会调用名为 revertToNitz ()的方法。显然 NITZ 相当于运营商世界中的 NTP 。
结论:由于 revertToNitz(),您可以将时间设置为运营商提供的值。不幸的是,我还没有找到一种机制来获取网络时间。如果您确实需要这样做,我担心,您将不得不复制这些 ServiceStateTrackers 实现,捕获框架提出的意图(我想),并添加 getter < / strong>到 mSavedTime 。
有关更多信息,建议您查看此链接here
答案 4 :(得分:0)
使用ScheduledExecutorService和scheduleAtFixedRate
向您发送“时钟滴答”。如果用户发起一个事件,并且自上次事件以来累积的“时钟滴答”数与系统时钟上的时间变化不匹配,那么你就会被骗。
您无需知道正确的时间。您需要知道正确的间隔。这可以使用任何周期性源,甚至是本地源。 (计时是两个工作:一个节拍器和节拍器间隔的贴标机。你不需要系统的标签,因为它们可以被骗,但即使标签被更改,节拍器也会打开。)
我建议使用相对较慢的滴答率(&lt; =每分钟1次滴答),而不是草率的比较(可能在2%以内),因为各种时钟可能都不准确。